作为构build过程的一部分,自动创buildNuGet包

我有一个自动构build过程,我想扩展,所以我可以build立我通过NuGet分发的库。 目前,运行nuget.exe来创build包是一个手动操作。

什么是设置VS 2010的最佳方式,以便我的NuGet包(* .nupkg)文件是“发布”版本的最终结果?

请记住,我有一些软件包的其他文件(内容和工具)。 而且,在大多数情况下,我有多个项目合并成一个NuGet包来支持.NET 4,Silverlight和Phone 7。

(我应该澄清,现有的“自动化”过程是一个简单的batch file运行器,使用命令行构build解决scheme。)

UPDATE

我想刷新这个讨论,因为这个问题还没有解决。 虽然提供的链接@pravin是有帮助的,但它并没有解决我在一个包中包含多个项目以及像PowerShell脚本,configuration和源代码转换等其他内容的事实。

我可以使用的最好的例子是具有.NET 4和Silverlight 5版本的程序集。 这些分发在同一个包里。 我无法使用生成后事件来创build程序包,因为程序包依赖于两个项目。

有一件事可能会奏效,就是创build一个自定义的MSBuild .proj文件。 您可以在自定义脚本中定义一对目标,第一个在您的解决scheme上执行编译。 执行以下编译的第二个目标将使用EXEC MSBuild任务来调用nuget.exe命令行实用程序。 然后,你更新你的batch file运行器来执行提供你的自定义项目文件作为参数的msbuild可执行文件。 您可能已经在您的批处理脚本中使用MSBuild,在这种情况下,它只是一个参数交换的问题。 您可以将您的自定义proj文件包含在解决scheme的解决scheme项目中。 如果你这样做,你可以很容易地在Visual Studio中添加一个外部工具引用来快速testing你的自定义脚本,以确保它正在构build和生产包,如你所愿。

示例MSBuild

你可以用这个作为起点:

<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> 

你会这样称呼它:

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

我正在做你想在我目前的项目中实现的事情:

每个程序集都build立在自己的适当的nuget包中,并具有依赖关系。

我通过在项目中创build一个包文件夹来解决这个问题。 在那里,我configuration了一个nuspec文件,其中包含关于nupkg的必要信息

在那里,我制作了Nuget包结构所需的所有文件夹和不变的文件。

我在项目中添加了一个后期构build步骤,将刚build好的文件复制到包文件夹中,并运行nuget.exe

所以呢:

  • build立项目。
  • 将输出复制回项目的Package \ Lib。
  • 在包文件夹中使用nuspec文件运行nuget.exe
  • 将结果复制到输出的其余部分旁边的输出文件夹。

Nuget.exe必须位于系统 buildserver(脏解决scheme)的固定文件夹中,或者包含在构build中(不太脏)。

Buildscript:

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

为了使用这个,你唯一需要照顾的是决定在哪里签入nuget.exe。 我在开发树的顶层创build了一个buildscripts文件夹。

如果您在TFS 2010环境中, NuGetter项目应该能够自动解决创buildnuget包的问题。 它为整个构build创build一个包。 这实际上是一个TFS 2010构build工作stream程,通过调用nuget.exe来完成这个工作。

我创build了一个名为NuBuild的NuGet项目types(.nuproj)Visual Studio扩展,它应该可以做你想做的。 它允许你从Visual Studio和MSBuild构build你的NuGet包。 你可以从库中安装它,或者在github上获取源代码。

在你的SLN中安装NuGet Powertools软件包,它会添加一个用于创buildnupkg的构build目标,然后修改你的CI来运行这个任务。 http://nuget.org/packages/NuGetPowerTools

有Nuget包CreateNewNuGetPackageFromProjectAfterEachBuild声称它可以做你想做的。 还有一个文档/项目网站。

一个简单的build议,可能会工作得很好…只是把它作为Postbuild事件到.csproj文件:

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

这将收集您的自定义.nuspec文件(需要命名为.csproj文件)并构build.nupkg。

而已。

您甚至可以在Visual Studio项目设置中简单地执行此操作。

据我所知,你不能。

相反,正确地做,并有一个正确的构build环境/进程,触发构build脚本提交/推到您的主要存储库,执行以下操作:

  • 克隆/拉取更改。
  • 构build解决scheme
  • 构build包(s)。
  • 上传包到服务器。

您可以在虚拟机上或现有的构build服务器上运行TeamCity,CruiseControl.NET或其他CI服务器。

安装“NuGet.for.MSBuild”nuget包。 不需要'.nuspec'文件,所需信息将从AssemblyInfo.cs中获取。

将构build设置为“释放”模式。 一旦build立,nupkg文件将在'bin / Release'文件夹中。

https://nuget4msbuild.codeplex.com/