自动创建NuGet包作为构建过程的一部分

时间:2012-02-07 17:30:17

标签: visual-studio-2010 msbuild nuget nuget-package

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

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

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

(我应该澄清现有的“自动化”流程是一个简单的批处理文件运行程序,它使用命令行构建解决方案。)

更新

我想更新此讨论,因为问题尚未解决。虽然提供的@pravin链接很有帮助,但它并没有解决我在单个包中有多个项目以及PowerShell脚本,配置和源代码转换等其他内容的事实。

我可以使用的最好的例子是同时具有.NET 4和Silverlight 5版本的程序集。它们分布在同一个包中。我不能使用post-build事件来创建包,因为包依赖于两个项目。

9 个答案:

答案 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="&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

答案 1 :(得分:10)

我正在做我想要在当前项目中实现的目标:

每个程序集都内置在自己的nuget包中,并具有依赖性。

我通过在项目中创建一个我想要创建nuget包的包文件夹来解决它。在那里我配置了一个nuspec文件,其中包含有关nupkg

的必要信息

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

我在项目中添加了一个post build步骤,该步骤将刚刚构建的文件复制到package文件夹中并运行nuget.exe

所以它是:

  • 构建项目。
  • 将输出复制回项目的Package \ Lib。
  • 使用包文件夹中的nuspec文件运行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;夹。

https://nuget4msbuild.codeplex.com/