是否有建议的方法使用MSBuild配置针对TeamCity中多个框架的NuGet包?

Dav*_*den 21 msbuild teamcity .net-framework-version multitargeting nuget

我已经阅读了一些帖子(参见下面的参考资料),还没有找到特定于我的技术堆栈的最佳实践指南.

目标:创建一个NuGet包,其目标是使用MSBuild和NuGet通过TeamCity从单个.csproj文件构建的多个.NET框架.

约束:

  1. 仅从VCS中提取代码一次.
  2. 所有已编译的程序集的版本都应相同.
  3. 单个.csproj(不是每个目标框架一个).

我有两种方法:

  1. 创建单个构建配置.它将包含三个构建步骤:编译.NET 3.5,编译.NET 4.0,使用NuGet打包.每个构建步骤都取决于最后一个成功.我用这种方法看到的唯一真正的问题(希望有一个我不知道的解决方案)是每个构建步骤都需要自己的一组构建参数(例如,system.TargetFrameworkVersion和system.OutputPath)来指定DLL的唯一位置(例如,bin\release\v3.5和bin\release\v4.0),以便NuGet包步骤能够根据.nuspec文件中的Files部分执行其操作.

  2. 创建多个构建配置.每个构建步骤的一个构建配置.使用这种方法,很容易解决TargetFrameworkVersion和OutputPath构建参数问题,但我现在必须创建快照依赖项并在构建中共享程序集版本号.它也会占用构建配置插槽,这对我们来说是好的(但不是最佳的),因为我们拥有Enterprise许可证.

选项#1似乎是显而易见的选择.选项#2感觉很脏.

所以我的两个问题是:

  1. 是否可以创建构建步骤特有的参数?
  2. 还有第三种更好的方法吗?

参考文献:

  1. 多框架NuGet构建带有内部依赖关系管理的符号
  2. Nuget - 打包一个包含多个项目的解决方案(针对多个框架)
  3. http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/
  4. http://msdn.microsoft.com/en-us/library/hh264223.aspx
  5. /sf/answers/75835371/
  6. http://confluence.jetbrains.com/display/TCD7/Configuring+Build+Parameters
  7. http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

Dav*_*den 24

这是我的首选解决方案(选项#1):

魔术依赖于一个不幸的解决方法.如果您愿意做出这种妥协,这个解决方案确实有效.如果不是,您可以按照我在JetBrains的问题跟踪器上打开的问题进行操作.

单一构建配置如下所示:

在此输入图像描述

请注意前两个构建步骤的名称.事实上,它们分别明确地命名为.NET 3.5和4.0的TargetFrameworkVersion值.

然后,在Build Parameters部分中,我配置了以下参数:

在此输入图像描述

最后,Nuget Pack步骤根据我的.nuspec文件部分进行文件路径转换:

<files>
    <file src="bin\release\v3.5\*.*" target="lib\net35" />
    <file src="bin\release\v4.0\*.*" target="lib\net40" />
</files>
Run Code Online (Sandbox Code Playgroud)


Dav*_*den 14

以下是采用第二种方法的解决方案:

该项目包含以下构建配置和模板:

在此输入图像描述

共享内部版本号生成器是链中的第一个构建.除了创建依赖构建将共享的构建号之外,它什么都不做.我正在使用Nicholas Williams提供的TeamCity引用的插件共享版本号.

以下是构建模板中值得注意的配置:

在此输入图像描述

请注意,内部版本号来自上面提到的共享内部版本号生成器的构建ID.因此,在我的情况下,该构建的ID为14.还要注意工件路径中的变量%TargetFrameworkVersion%.幸运的是,TeamCity几乎在任何地方都支持变量插值.

为了使模板能够利用构建号,它必须对该构建配置具有快照依赖性:

在此输入图像描述

最后(关于模板),构建参数几乎与我首选解决方案中的参数相同.但请注意附加的配置参数.这是继承构建配置将覆盖的内容:

在此输入图像描述

然后,在依赖构建中,您必须连接快照依赖项,以便构建号(从模板继承)实际上也可以依赖于共享构建号构建配置:

在此输入图像描述

当然,您需要设置实际的目标框架:

在此输入图像描述

配置实际构建后,您现在可以配置NuGet包构建配置.您无需附加到VCS根目录:

在此输入图像描述

但是您确实需要配置一堆依赖项(快照和工件):

在此输入图像描述

最后,你完成了.