22

我已经阅读了一些帖子(请参阅下面的参考资料),但尚未找到针对我的技术堆栈的最佳实践指南。

目标:通过 TeamCity 使用 MSBuild 和 NuGet,创建针对多个 .NET 框架的单个 NuGet 包。

约束:

  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 构建参数问题,但我现在必须创建快照依赖项并在构建之间共享程序集版本号。它还占用了构建配置槽,这对我们来说是可以的(但不是最佳的),因为我们确实有企业许可证。

选项#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. https://stackoverflow.com/a/1083362/607701
  6. http://confluence.jetbrains.com/display/TCD7/Configuring+Build+Parameters
  7. http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package
4

2 回答 2

25

这是我的首选解决方案(选项 #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>
于 2013-04-17T17:45:39.220 回答
14

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

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

在此处输入图像描述

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

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

在此处输入图像描述

请注意,内部版本号来自上述共享内部版本号生成器的内部版本 ID。因此,就我而言,该构建的 ID 为 14。还要注意工件路径中的变量 %TargetFrameworkVersion%。幸运的是,TeamCity 几乎在所有地方都支持变量插值。

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

在此处输入图像描述

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

在此处输入图像描述

然后,在依赖的构建中,您必须连接一个快照依赖项,以便构建号(从模板继承)通过对共享构建号构建配置的依赖来实际工作:

在此处输入图像描述

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

在此处输入图像描述

配置了实际构建后,您现在可以配置 NuGet 包构建配置。您不需要附加到 VCS 根:

在此处输入图像描述

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

在此处输入图像描述

最后,你完成了。

于 2013-04-17T18:04:51.433 回答