2012-02-07 42 views
63

Tôi có một quy trình xây dựng tự động mà tôi muốn mở rộng để tôi có thể xây dựng các thư viện mà tôi đang phân phối qua NuGet. Hiện tại, chạy nuget.exe để tạo các gói là một thao tác thủ công.Tự động tạo gói NuGet như một phần của quá trình xây dựng

Cách tốt nhất để thiết lập VS 2010 để gói NuGet (* .nupkg) của tôi là kết quả cuối cùng của bản dựng "Bản phát hành"?

Hãy nhớ rằng tôi có các tệp khác (nội dung và công cụ) cho một số gói. Và, trong hầu hết các trường hợp, tôi có nhiều dự án được hợp nhất thành một gói NuGet duy nhất để hỗ trợ .NET 4, Silveright và Điện thoại 7.

(Tôi nên làm rõ rằng quy trình "tự động" hiện tại là một tập hợp tệp hàng loạt đơn giản đó xây dựng một giải pháp sử dụng dòng lệnh.)

CẬP NHẬT

tôi muốn làm mới cuộc thảo luận này vì vấn đề chưa được giải quyết. Trong khi liên kết @pravin được cung cấp là hữu ích, nó không giải quyết thực tế là tôi có nhiều dự án trong một gói đơn cũng như các nội dung khác như PowerShell script, cấu hình và mã nguồn biến đổi, v.v.

Ví dụ tốt nhất tôi có thể sử dụng là một assembly có cả phiên bản .NET 4 và Silverlight 5. Chúng được phân phối trong cùng một gói. Tôi không thể sử dụng sự kiện post-build để tạo gói vì gói phụ thuộc vào hai dự án.

+0

Bạn có thử: http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages – KMoraz

+5

Điều đó không có bất cứ điều gì để làm với câu hỏi của tôi. Liên kết đó mô tả quy trình làm việc để SỬ DỤNG gói nuget. Câu hỏi của tôi phải làm với CREATING gói nuget. – SonOfPirate

+1

Ngoài ra tự động tăng phiên bản trong bản phát hành bản phát hành sẽ tốt đẹp. –

Trả lời

32

Một điều có thể hoạt động tốt là tạo tệp MSBuild .proj tùy chỉnh. Bạn có thể xác định một vài mục tiêu trong tập lệnh tùy chỉnh, đầu tiên để thực thi biên dịch trên giải pháp của bạn. Mục tiêu thứ hai để thực hiện việc biên dịch sau đây sẽ sử dụng tác vụ EXEC MSBuild để gọi tiện ích dòng lệnh nuget.exe. Sau đó, bạn cập nhật tập tin batch-runner của bạn để thực thi msbuild thực thi cung cấp tệp dự án tùy chỉnh của bạn làm đối số. Bạn có thể đã sử dụng MSBuild trong kịch bản lệnh batch của bạn, trong trường hợp đó, nó đơn giản chỉ là vấn đề trao đổi đối số. Bạn có thể bao gồm tệp proj tùy chỉnh của mình trong các mục giải pháp của giải pháp của bạn. Nếu bạn đã làm điều đó bạn có thể dễ dàng thêm một tham chiếu công cụ bên ngoài trong Visual Studio để nhanh chóng kiểm tra kịch bản tùy chỉnh của bạn để đảm bảo rằng nó đã được xây dựng và sản xuất các gói như bạn hy vọng.

MSBuild mẫu

Bạn có thể sử dụng điều này như là một nơi bắt đầu:

<Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > 
    <PropertyGroup> 
     <SolutionFile></SolutionFile> 
     <NugetExecutable>C:\PathToNuget\nuget.exe</NugetExecutable> 
     <NuspecFile></NuspecFile> 
    </PropertyGroup> 

    <Target Name = "Compile"> 
     <MSBuild Projects="$(SolutionFile)" Properties="Configuration=Release" /> 
    </Target> 

    <Target Name = "Package"> 
    <!-- You could use the MSBuild Copy task here to move the compiled code into 
      a structure that fits your desired package format --> 
     <Exec Command="&quot;$(NugetExecutable)&quot; pack $(NuspecFile)" /> 
    </Target> 
</Project> 

Sau đó bạn muốn gọi như thế này:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Build.proj /p:SolutionFile=PathToSolution\App.sln;NuspecFile=foo.nuspec 
+0

Bạn có thể cung cấp cho tôi một số tài liệu tham khảo để xem cách thực hiện điều này không? – SonOfPirate

+0

Lưu ý: mẫu ở trên chưa được kiểm tra đầy đủ, nhưng đó là khái niệm về cách bạn có thể sử dụng nó. Các MSBuild tham khảo trên MSDN sẽ giúp bạn xác thịt nó ra đầy đủ hơn. –

+5

Tôi khuyên bạn nên sử dụng NuGetter. Việc sử dụng và cấu hình đơn giản hơn nhiều :) –

0

Theo như tôi biết, bạn không thể.

Thay vào đó, làm điều đó đúng và có một xây dựng môi trường thích hợp/quá trình đó bắn một kịch bản xây dựng trên cam/đẩy vào kho lưu trữ chính của bạn mà điều sau đây:

  • Clone/kéo thay đổi.
  • Giải pháp xây dựng.
  • Xây dựng (các) gói.
  • Tải (các) gói lên máy chủ gói.

Bạn có thể chạy TeamCity, CruiseControl.NET hoặc một số máy chủ CI khác trên máy ảo hoặc trên máy chủ xây dựng hiện tại của bạn.

+1

Bạn chắc chắn có thể xây dựng một số thư viện cho công việc tạo gói nuget như là một phần của quá trình xây dựng và thậm chí gửi nó tới nguồn cấp dữ liệu nội bộ của công ty. Tôi rất vui khi thấy có một thư viện giúp với điều này bây giờ tôi sẽ phải thử nghiệm với nó trong giai đoạn xây dựng thử nghiệm tiếp theo của chúng tôi –

4

Cài đặt gói NuGet PowerTools tại của bạn sln và nó sẽ thêm một mục tiêu xây dựng để tạo ra nupkg sau đó chỉ cần sửa đổi CI của bạn để chạy nhiệm vụ đó. http://nuget.org/packages/NuGetPowerTools

+0

Phiên bản 1.6 bổ sung thêm tùy chọn mức giải pháp cho phép bạn thêm mục tiêu xây dựng vào từng dự án, do đó bạn không phải cam kết các gói để kiểm soát nguồn. Trong khi tệp mục tiêu xây dựng được sử dụng bởi tất cả các dự án, nó vẫn được thực hiện như là một phần của quá trình xây dựng cho từng dự án riêng lẻ. Điều đó không giúp ích cho tình huống của tôi khi tôi cần tạo một gói duy nhất chứa đầu ra xây dựng từ một số dự án. – SonOfPirate

10

tôi đang làm điều bạn muốn đạt được đã có trong dự án hiện tại của tôi:

Mỗi lắp ráp được xây dựng vào gói NuGet thích riêng của mình, với sự phụ thuộc tại chỗ.

Tôi đã giải quyết nó bằng cách tạo một thư mục gói trong dự án mà tôi muốn tạo gói nuget. Ở đó tôi cấu hình một tập tin nuspec với các thông tin cần thiết về nupkg

Ở đó tôi tạo tất cả các thư mục và các tệp không thay đổi trong đó cần thiết cho cấu trúc gói Nuget.

Tôi đã thêm một bước bài xây dựng trong dự án mà bản sao các tập tin mà chỉ được xây dựng vào thư mục gói và chạy nuget.exe

Vì vậy, nó đi: Dự án

  • xây dựng.
  • Sao chép kết quả vào Gói \ Lib của dự án.
  • Chạy nuget.exe bằng tệp nuspec trong thư mục gói.
  • Sao chép kết quả vào thư mục đầu ra bên cạnh phần còn lại của đầu ra.

Nuget.exe phải là một trong hai trong một thư mục cố định trên hệ thống của bạn các buildserver (giải pháp bẩn) hoặc bao gồm trong xây dựng của bạn (ít bẩn).

buildscript:

Xcopy.exe /Y "$(TargetPath)" "$(ProjectDir)\Package\Lib" 
cd "$(ProjectDir)Package" 
"$(TargetDir)..\Buildscripts\Nuget.exe" pack MyPackage.nuspec xcopy /Y *.nupkg "$(TargetDir)" 

Để sử dụng này, điều duy nhất bạn cần phải chăm sóc, được quyết định nơi để checkin các nuget.exe. Tôi đã tạo một thư mục buildscripts ở cấp cao nhất của cây phát triển của mình.

+1

Tôi tin rằng bạn có thể sao chép đầu ra từ các dự án khác cũng trong bước xây dựng bài đăng, nếu bạn biết chúng đã được tạo ... – Schwarzie2478

+1

Nhận xét của bạn là chìa khóa - "nếu bạn biết chúng đã được xây dựng". – SonOfPirate

+0

tôi cho rằng có một thứ tự nhất định để xây dựng để khởi chạy. Nếu không, bạn có thể cấu hình các dự án trống mà luôn luôn có được xây dựng như là một bước cuối cùng – Schwarzie2478

7

Nếu bạn đang ở trong môi trường TFS 2010, NuGetter project sẽ giải quyết vấn đề tạo gói nuget tự động. Nó tạo ra một gói cho toàn bộ bản dựng. Đó là trong thực tế, một công việc xây dựng TFS 2010 thực hiện công việc bằng cách gọi nuget.exe với một số đối số.

+0

Mặc dù, nó không thể tạo ra một gói nuget cho mỗi dự án với mẫu này. Có ai từng làm điều đó ở cấp TFS 2010 không? – Alex

+0

NuGetter cũng sẽ hoạt động cho TFS 2012, nhưng bạn sẽ cần phải nâng cấp các hội đồng lên TFS 2012. –

+0

NuGetter cũng được đề xuất trong việc chuyển qua MVP Marcel de Vries của Microsoft trong một video không liên quan. Tò mò về giá trị của nó so với NuBuild. – RJB

7

Tôi đã tạo một loại dự án NuGet (.nuproj) Visual Studio mở rộng được gọi là NuBuild mà nên làm những gì bạn muốn. Nó cho phép bạn xây dựng các gói NuGet của bạn từ Visual Studio cũng như MSBuild. Bạn có thể cài đặt nó từ gallery hoặc lấy nguồn tại github.

+1

Tò mò về giá trị của nó so với NuGetter – RJB

1

Có gói Nuget CreateNewNuGetPackageFromProjectAfterEachBuild tuyên bố rằng nó có thể làm những gì bạn muốn.Ngoài ra còn có một documentation/project site.

+0

Tôi nghĩ rằng plugin này là dành cho IDE xây dựng trong Visual Studio, không phải MSBuilds trong TFS. Liệu tôi có sai? –

+0

@PrisonerZERO - Nó hoạt động cho IDE xây dựng và tôi đã không thử nó cho MSBuilds. – habakuk

1

Một gợi ý đơn giản mà có thể làm việc đủ tốt ... chỉ cần đặt nó như là sự kiện Postbuild vào file csproj:

<PropertyGroup> 
    <PostBuildEvent>$(SolutionDir)<YourPathToNugetHere>\NuGet.exe pack $(ProjectPath) -OutputDirectory ..\..\$(OutDir) -IncludeReferencedProjects -Symbols -Properties Configuration=$(Configuration)</PostBuildEvent> 
    </PropertyGroup> 

này sẽ thu thập tùy chỉnh của bạn .nuspec nộp (mà nhu cầu được đặt tên như tệp .csproj) và tạo tệp .nupkg.

Thats it.

Bạn thậm chí có thể thực hiện việc này đơn giản trong cài đặt Dự án Visual Studio.

0

Cài đặt gói nuget 'NuGet.for.MSBuild'. Không cần tệp '.nuspec' và thông tin bắt buộc sẽ được lấy từ AssemblyInfo.cs.

Đặt chế độ xây dựng thành chế độ 'Phát hành'. Sau khi xây dựng tập tin nupkg sẽ nằm trong thư mục 'bin/Release'.

https://nuget4msbuild.codeplex.com/

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