繁体   English   中英

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

[英]Automating creating NuGet package as part of build process

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

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

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

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

UPDATE

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

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

可能工作得很好的一件事是创建一个自定义的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

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

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

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

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

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

所以它是:

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

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

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文件夹。

如果您处于TFS 2010环境中, NuGetter项目应该可以解决自动创建nuget包的问题。 它为整个构建创建了一个包。 它实际上是一个TFS 2010构建工作流,它通过调用带有一些参数的nuget.exe来完成工作。

我创建了一个名为NuBuild的NuGet项目类型(.nuproj)Visual Studio扩展,它可以做你想要的。 它允许您从Visual Studio和MSBuild构建NuGet包。 您可以从库中安装它,也可以在github上获取源代码。

在您的sln中安装NuGet Powertools软件包,它将添加一个用于创建nupkg的构建目标,然后只需修改CI以运行该任务。 http://nuget.org/packages/NuGetPowerTools

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

一个简单的建议可能足够好......只需将它作为Postbuild事件放入.csproj文件中:

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

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

而已。

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

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

将构建设置为“释放”模式。 构建完成后,nupkg文件将位于“bin / Release”文件夹中。

https://nuget4msbuild.codeplex.com/

据我所知,你做不到。

相反,要正确执行并拥有适当的构建环境/进程,在提交/推送到主存储库时触发构建脚本,执行以下操作:

  • 克隆/拉动变化。
  • 构建解决方案
  • 构建包。
  • 将包上传到包服务器。

您可以在VM或现有构建服务器上运行TeamCity,CruiseControl.NET或其他CI服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM