我有一个自动构建过程,我想扩展,所以我可以构建我通过NuGet分发的库 . 目前,运行nuget.exe来创建包是一个手动操作 .
What is the best way to setup VS 2010 so that my NuGet package (*.nupkg) file is the end result of a "Release" build?
请记住,我有一些软件包的其他文件(内容和工具) . 而且,在大多数情况下,我将多个项目合并到一个NuGet包中,以支持.NET 4,Silveright和Phone 7 .
(我应该澄清现有的"automated"进程是一个简单的批处理文件运行器,它使用命令行构建解决方案 . )
UPDATE
我想更新此讨论,因为问题尚未解决 . 虽然提供的@pravin链接很有帮助,但它并没有解决我在单个包中有多个项目以及PowerShell脚本,配置和源代码转换等其他内容的事实 .
我可以使用的最好的例子是具有.NET 4和Silverlight 5版本的程序集 . 它们分布在同一个包中 . 我不能使用post-build事件来创建包,因为包依赖于两个项目 .
9 回答
Nuget包CreateNewNuGetPackageFromProjectAfterEachBuild声称它可以做你想要的 . 还有documentation/project site.
可能运行良好的一件事是创建自定义MSBuild .proj文件 . 您可以在自定义脚本中定义几个目标,第一个在您的解决方案上执行编译 . 编译后执行的第二个目标将使用EXEC MSBuild任务来调用nuget.exe命令行实用程序 . 然后,更新批处理文件运行器以执行提供自定义项目文件作为参数的msbuild可执行文件 . 您可能已经在批处理脚本中使用MSBuild,在这种情况下,它只是参数交换的问题 . 您可以将自定义proj文件包含在解决方案的解决方案项中 . 如果您这样做,您可以轻松地在Visual Studio中添加外部工具引用,以快速测试您的自定义脚本,以确保它正在构建和生成您希望的包 .
Sample MSBuild
您可以将此作为起点:
然后你会这样称呼:
我正在做你想要在我当前项目中实现的事情:
每个程序集都内置在自己的nuget包中,并具有依赖性 .
我通过在项目中创建一个我想要创建nuget包的包文件夹来解决它 . 在那里,我配置了一个nuspec文件,其中包含有关nupkg的必要信息
在那里我制作了Nuget包结构所需的所有文件夹和不变的文件 .
我在项目中添加了一个post build步骤,它将刚刚构建的文件复制到package文件夹中并运行
nuget.exe
所以它是:
建设项目 .
将输出复制回项目的Package \ Lib .
使用包文件夹中的nuspec文件运行
nuget.exe
.将结果复制到输出的其余部分旁边的输出文件夹 .
Nuget.exe必须位于系统上的固定文件夹和buildserver(脏解决方案)中,或者包含在构建中(不太脏) .
Buildscript:
为了使用它,您唯一需要注意的是决定在哪里检查nuget.exe . 我在开发树的顶层创建了一个buildscripts文件夹 .
如果您在TFS 2010环境中,NuGetter project应解决自动创建nuget包的问题 . 它为整个构建创建了一个包 . 它实际上是一个TFS 2010构建工作流,通过调用带有一些参数的nuget.exe来完成工作 .
安装'NuGet.for.MSBuild'nuget包 . 不需要'.nuspec'文件,所需信息将从AssemblyInfo.cs中获取 .
将构建设置为“释放”模式 . 构建完成后,nupkg文件将位于“bin / Release”文件夹中 .
https://nuget4msbuild.codeplex.com/
一个简单的建议可能足够好......只需将它作为Postbuild事件放入.csproj文件中:
这将收集您的自定义.nuspec文件(需要命名为.csproj文件)并构建.nupkg .
而已 .
您甚至可以在Visual Studio Project设置中执行此操作 .
在您的sln中安装NuGet Powertools软件包,它将添加一个用于创建nupkg的构建目标,然后只需修改CI以运行该任务 . http://nuget.org/packages/NuGetPowerTools
我创建了一个名为NuBuild的NuGet项目类型(.nuproj)Visual Studio扩展,它可以做你想要的 . 它允许您从Visual Studio和MSBuild构建NuGet包 . 您可以从gallery安装它,也可以在github获取源代码 .
据我所知,你不能 .
相反,请正确执行并拥有适当的构建环境/进程,在提交/推送到您的主存储库时触发构建脚本,执行以下操作:
克隆/拉动更改 .
构建解决方案 .
构建包 .
将包上传到包服务器 .
您可以在VM或现有构建服务器上运行TeamCity,CruiseControl.NET或其他CI服务器 .