13

Tôi muốn sử dụng sự kiện sau xây dựng để tự động tạo gói nuget và sau đó sao chép nó vào một thư mục được chia sẻ trên mạng của chúng tôi, giống như thế này (số phiên bản 1.0.0.0. được quy định trong tập tin MyLib.nuspec):Làm thế nào để có được số phiên bản trong sự kiện sau khi xây dựng

nuget.exe pack "$(SolutionDir)MyLib.nuspec" 
xcopy /Y "$(TargetDir)MyLib.1.0.0.0.nupkg" \\folder\subfolder\NuGetPackages 

này hoạt động, nhưng bây giờ tôi muốn cập nhật kịch bản này, vì vậy mà nó sẽ bao gồm các phiên bản lắp ráp cũng có, nhưng tôi không thể nhận được phiên bản lắp ráp bên trong hậu xây dựng sự kiện. Tôi sẽ cần một cái gì đó như thế này:

nuget.exe pack -Version $(AssemblyVersion) "$(SolutionDir)MyLib.nuspec" 
xcopy /Y "$(TargetDir)MyLib." + $(AssemblyVersion) + ".nupkg" \\folder\subfolder\NuGetPackages 

Nhưng biến $ (AssemblyVersion) không tồn tại ... Bất kỳ ý tưởng nào?

+0

thể trùng lặp của [Xác Version hội trong một tổ chức sự kiện Build bài viết?] (Http://stackoverflow.com/questions/2243593/determine-assembly-version-during-a-post-build-event) – sll

Trả lời

5

Tập lệnh tạo bài đăng này hoạt động cho tôi.Nó gói và xuất bản các phiên bản dev của tôi trên mỗi bản dựng. Khá đơn giản.

del $(ProjectDir)bin\Debug\*.nupkg 
"$(ProjectDir)NuGet.exe" pack "$(ProjectDir)MyProject.csproj" 
forfiles /P $(ProjectDir)bin\Debug\ /m *.nupkg /c "cmd /c "$(ProjectDir)NuGet.exe" push @FILE -Source \\SHARE\NuGet" 
3

Hãy thử điều này:

Chỉnh sửa file csproj của bạn và thêm khối này:

<Target Name="AfterBuild"> 
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> 
     <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" /> 
    </GetAssemblyIdentity> 
    <Exec Command="xcopy /Y $(TargetDir)MyLib.%(CurrentAssembly.Version).nupkg \\folder\subfolder\NuGetPackages"></Exec> 
</Target> 
3

Hãy thử như sau:

1) Đổi tên bạn .nuspec cho khớp với tên csproj:

Nếu dự án của bạn là: MyLib.csproj

Rename MyLib.nuspec để MyLib.csproj.nuspec

2) Sửa đổi tập tin .nuspec của bạn như sau:

<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 
    <metadata> 
    <version>$version$</version> 
    <authors>$author$</authors> 
    <id>$id$</id> 
    <title>$id$</title> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>$description$</description> 
    <summary>$description$</summary> 
    </metadata> 
</package> 

Ở đây, công việc được thực hiện bằng "$ NuGet của version $ "token (và những người khác)

Hãy xem Nuget article này để biết thêm thông tin và mã thông báo.

3) Sử dụng các bài viết sau Xây dựng tổ chức sự kiện trong mỗi dự án bạn đặt một tập tin .csproj.nuspec (hãy loại bỏ các phím Enter):

mkdir "$(SolutionDir)GeneratedPackages" 

"$(SolutionDir).nuget\nuget.exe" pack "$(ProjectPath)" 
-OutputDirectory "$(SolutionDir)GeneratedPackages" 
-basepath "$(SolutionDir)$(ProjectName)\$(OutDir)" 

Nếu chúng ta có một giải pháp C: \ MySolution \ mylib. sln và dự án tại c: \ MySolution \ mylib \ MyLib.csproj, file .nuspec của chúng tôi nên c: \ MySolution \ mylib \ MyLib.csproj.nuspec và Bưu Xây dựng tổ chức sự kiện lệnh sẽ như thế nào:

mkdir "C:\MySolution\GeneratedPackages" 

"C:\MySolution\.nuget\nuget.exe" pack "C:\MySolution\MyLib\MyLib.csproj" 
-OutputDirectory "C:\MySolution\GeneratedPackages" 
-basepath "C:\MySolution\MyLib\bin\debug\" 

Sửa đường dẫn đến nuget.exe. Trong trường hợp của tôi, tôi đang sử dụng Nuget "tự động tái tạo các phụ thuộc bị thiếu trong xây dựng" và tôi có một bản sao cục bộ trong giải pháp, trong thư mục .nuget.

Xin lưu ý rằng chúng tôi không gọi nuget bằng tệp .nuspec, chúng tôi là gọi điện trực tiếp với .csproj !!

Chiến lược này cũng sẽ bao gồm tất cả các phụ thuộc của Dự án được khai báo trong gói mà Nuget tạo khi bạn cài đặt gói. (tự động, mỗi khi bạn xây dựng)

Và bạn đã hoàn tất!Bây giờ thay đổi hội và phiên bản tập tin trong

Project> Properties> Thông tin hội

QUAN TRỌNG: Nếu bạn đặt $ tác giả và $ description $ tokens $/hoặc điền vào cũng ty và mô tả của hội các trường ở đây. Nếu bạn gặp sự cố, hãy xóa $ token $ và/hoặc $ description $ tokens và cố gắng biên dịch lại.

và tạo Dự án của bạn, bạn sẽ thấy trong/GeneratedPackages thư mục MyLib.X.X.X.X.nupack với phiên bản bạn đã đặt trong Thuộc tính dự án. Nếu bạn đặt các phụ thuộc, bạn sẽ thấy rằng nó đã được tự động bao gồm dưới dạng Phụ thuộc gói.

Chúng tôi đang sử dụng chiến lược này với máy chủ Jenkins CI để tự động hóa giải pháp và sao chép các gói từ GeneratedPackages vào NugetServer tùy chỉnh của chúng tôi.

Bạn cũng có thể hoàn thành bài viết Xây dựng tổ chức sự kiện với một

nuget push 

Để gửi các gói được tạo ra tới một máy chủ NuGet

vấn đề trong CHÍ:

Như đã đề cập trong ý kiến, có là một vấn đề không cho phép Nuget.exe tạo các gói trong chế độ RELEASE.

Làm điều này để sửa chữa nó:

Đối với mỗi dự án với kịch bản này:

  1. Project Properties> Xây dựng
  2. Trong mục "Cấu hình" thả xuống chọn "Tất cả các cấu hình"
  3. Trong phần "Ouput", thay đổi trường "Đường dẫn đầu ra:", ví dụ: Tôi hiện đang sử dụng "bin \" (không có cuotes)
+1

Điều này hoạt động nếu Cấu hình được đặt thành Gỡ lỗi. Nhưng ngay sau khi tôi thay đổi nó để phát hành, sau đó tôi nhận được một ngoại lệ "Không thể tìm thấy đường dẫn \ bin \ Debug \ MyDll.dll". Đảm bảo dự án đã được xây dựng. Điều đó có nghĩa là, nuget vẫn đang tìm trong thư mục Debug thay vì Release. Bất kỳ ý tưởng? – sventevit

+1

Tôi cũng đã tìm thấy vấn đề này. Tôi nên thông báo cho Nuget Team. Để khắc phục, thư mục DEBUG và RELEASE phải bằng nhau. Điều duy nhất cần quan tâm là bạn nên xây dựng lại giải pháp khi bạn chuyển từ chế độ này sang chế độ khác. Đối với mỗi dự án có tập lệnh này: 1. Thuộc tính dự án> Xây dựng 2. Trong trình đơn thả xuống "Cấu hình" chọn "Tất cả cấu hình" 3. Trong phần "Ouput", thay đổi trường "Đường dẫn đầu ra:" Ví dụ, tôi hiện đang sử dụng "bin \" (không có cuotes) Với sửa chữa này, Nuget.exe sẽ tạo ra de gói trong cả hai DEBUG và RELEASE – sesispla

+1

@sesispla @sventevit Bạn cần thêm cài đặt gói bổ sung: '-Properties" Cấu hình = $ (Cấu hình); Nền tảng = $ (Nền tảng) "' cho phép nó hoạt động trong bản phát hành mà không thay đổi thư mục đầu ra. –

1

tôi đã cố gắng những gì giammin đề nghị, và với một vài điều chỉnh đã làm việc này cho tôi:

<Target Name="AfterBuild"> 
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> 
     <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" /> 
    </GetAssemblyIdentity> 
    <Exec Command="copy /Y $(TargetPath) $(ProjectDir)Versions\$(TargetName)_%(CurrentAssembly.Version).dll" Condition="'$(ConfigurationName)' == 'Stage'" /> 
</Target> 

tôi đã thêm các "thuộc tính Điều kiện để tôi có thể xác định khi tôi sẽ có điều này được xây dựng đến một địa điểm cụ thể (trong tôi trường hợp tạo ra một bản sao lưu cho rollbacks). Ngoài ra, "xcopy" đã cho tôi lỗi ... nhưng một "bản sao" bình thường thì không.

Sau đó, trong tôi sự kiện sau xây dựng Tôi có một cái gì đó như thế này:

copy $(TargetDir)*.dll \\dev-server\folder 

IF NOT "$(ConfigurationName)" == "Stage" EXIT 

mkdir "$(ProjectDir)Versions" 
copy /Y "$(TargetPath)" \\stage-server\folder 

Tôi hy vọng rằng tất cả sẽ giúp một cách nào đó.

Lưu ý rằng sự kiện sau khi xây dựng được thực thi TRƯỚC KHI phần tử "AfterBuild" của XML csproj.

Vì vậy, bạn chỉ có thể sử dụng trong bạn đăng sự kiện xây dựng: gói nuget.exe "$ (SolutionDir) MyLib.nuspec" và thêm phần tử afterbuild cho bản sao và bạn sẽ ổn.

Các vấn đề liên quan