我有一个自动构建过程,我想扩展,所以我可以构建我通过NuGet分发的库。目前,运行nuget.exe来创建软件包是一种手动操作。
设置VS 2010的最佳方法是什么,以便我的NuGet包(* .nupkg)文件是“发布”版本的最终结果?
请记住,我有一些软件包的其他文件(内容和工具)。而且,在大多数情况下,我将多个项目合并为一个NuGet包,以支持.NET 4,Silveright和Phone 7。
(我应该澄清现有的“自动化”流程是一个简单的批处理文件运行程序,它使用命令行构建解决方案。)
更新
我想更新此讨论,因为问题尚未解决。虽然提供的@pravin链接很有帮助,但它并没有解决我在单个包中有多个项目以及PowerShell脚本,配置和源代码转换等其他内容的事实。
我可以使用的最好的例子是同时具有.NET 4和Silverlight 5版本的程序集。它们分布在同一个包中。我不能使用post-build事件来创建包,因为包依赖于两个项目。
答案 0 :(得分:32)
可能运行良好的一件事是创建自定义MSBuild .proj文件。您可以在自定义脚本中定义几个目标,第一个在您的解决方案上执行编译。编译后执行的第二个目标将使用EXEC MSBuild任务来调用nuget.exe命令行实用程序。然后,更新批处理文件运行器以执行提供自定义项目文件作为参数的msbuild可执行文件。您可能已经在批处理脚本中使用MSBuild,在这种情况下,它只是一个参数交换的问题。您可以将自定义proj文件包含在解决方案的解决方案项中。如果您这样做,您可以在Visual Studio中轻松添加外部工具引用,以快速测试您的自定义脚本,以确保它像您希望的那样构建和生成包。
示例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=""$(NugetExecutable)" pack $(NuspecFile)" />
</Target>
</Project>
然后你会这样称呼:
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Build.proj /p:SolutionFile=PathToSolution\App.sln;NuspecFile=foo.nuspec
答案 1 :(得分:10)
我正在做我想要在当前项目中实现的目标:
每个程序集都内置在自己的nuget包中,并具有依赖性。
我通过在项目中创建一个我想要创建nuget包的包文件夹来解决它。在那里我配置了一个nuspec文件,其中包含有关nupkg
的必要信息在那里我制作了Nuget包结构所需的所有文件夹和不变的文件。
我在项目中添加了一个post build步骤,该步骤将刚刚构建的文件复制到package文件夹中并运行nuget.exe
所以它是:
nuget.exe
。Nuget.exe必须位于系统上的固定文件夹中,构建服务器(脏解决方案)或包含在您的构建中(不太脏)。
Buildscript:
Xcopy.exe /Y "$(TargetPath)" "$(ProjectDir)\Package\Lib"
cd "$(ProjectDir)Package"
"$(TargetDir)..\Buildscripts\Nuget.exe" pack MyPackage.nuspec xcopy /Y *.nupkg "$(TargetDir)"
为了使用它,您唯一需要注意的是决定在哪里检查nuget.exe。我在开发树的顶层创建了一个buildscripts文件夹。
答案 2 :(得分:7)
如果您处于TFS 2010环境中,NuGetter project应解决自动创建nuget包的问题。它为整个构建创建了一个包。它实际上是一个TFS 2010构建工作流,它通过调用带有一些参数的nuget.exe来完成工作。
答案 3 :(得分:7)
我创建了一个名为NuBuild的NuGet项目类型(.nuproj)Visual Studio扩展,可以执行您想要的操作。它允许您从Visual Studio和MSBuild构建NuGet包。您可以从gallery安装,也可以在github获取来源。
答案 4 :(得分:4)
在您的sln中安装NuGet Powertools软件包,它将添加一个用于创建nupkg的构建目标,然后只需修改CI以运行该任务。 http://nuget.org/packages/NuGetPowerTools
答案 5 :(得分:1)
有Nuget包 CreateNewNuGetPackageFromProjectAfterEachBuild声称它可以做你想做的事。还有documentation/project site.
答案 6 :(得分:1)
一个可能工作得很好的简单建议......只需将它作为Postbuild事件放入.csproj文件中:
<PropertyGroup>
<PostBuildEvent>$(SolutionDir)<YourPathToNugetHere>\NuGet.exe pack $(ProjectPath) -OutputDirectory ..\..\$(OutDir) -IncludeReferencedProjects -Symbols -Properties Configuration=$(Configuration)</PostBuildEvent>
</PropertyGroup>
这将收集您的自定义.nuspec文件(需要命名为.csproj文件)并构建.nupkg。
多数民众赞成。
您甚至可以在Visual Studio项目设置中执行此操作。
答案 7 :(得分:0)
据我所知,你不能。
相反,请正确执行此操作并拥有适当的构建环境/进程,以便在提交/推送到您的主存储库时触发构建脚本,执行以下操作:
您可以在VM或现有构建服务器上运行TeamCity,CruiseControl.NET或其他CI服务器。
答案 8 :(得分:0)
安装&#39; NuGet.for.MSBuild&#39; nuget包。没有&#39; .nuspec&#39;文件是必需的,所需信息将从AssemblyInfo.cs中获取。
将构建设置为&#39;发布&#39;模式。构建完成后,nupkg文件将位于&bin; / Release&#39;夹。