在使用MSBuild配置TeamCity中的NuGet包以针对多个框架时,是否有推荐的方法?

22

我已经阅读了一些文章(参见下文),但仍然没有找到一个特定于我的技术栈的最佳实践指南。

目标:通过使用MSBuild和NuGet,从单个.csproj文件构建针对多个.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),以便于基于.nuspec文件中的文件部分执行NuGet打包步骤。

  2. 创建多个构建配置。每个构建配置均针对上述构建步骤。使用此方法,可以轻松解决TargetFrameworkVersion和OutputPath构建参数问题,但现在我必须创建快照依赖项并在构建之间共享程序集版本号。它还耗用了构建配置槽,这对我们来说是可以的(但不是最佳选择),因为我们拥有企业许可证。

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

所以我的两个问题是:

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

参考文献:

  1. 多框架 NuGet 构建,带有符号以进行内部依赖管理
  2. Nuget - 打包具有多个项目(针对多个框架)的解决方案
  3. 创建 NuGet 包的技巧
  4. MSDN:创建和发布 NuGet 包
  5. 如何在 Visual Studio 中配置构建参数
  6. JetBrains TC:配置构建参数
  7. NuGet 官方文档:创建和发布 NuGet 包

我已经按照这两种方法分别得出了解决方案,一旦时间允许,我会很快发布单独的答案。 - David Peden
我怀着满心期待的心情等待;-)巧合的是,我也有同样的需求。 - Tim Long
哈哈,Tim。我从你在YouTrack讨论中的程序集信息(http://youtrack.jetbrains.com/issue/TW-27596)中认出了你的名字。你和我都在关注同一个问题。我会尽量在本周发布我的两个答案。;) - David Peden
2个回答

25

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

魔法依赖于一个不幸的解决方法。如果您愿意妥协,此解决方案确实有效。如果您不愿意,您可以关注 JetBrains问题跟踪器上我提出的问题

单个生成配置如下所示:

输入图像描述

请注意前两个生成步骤的名称。它们实际上明确命名为.NET 3.5和4.0的TargetFrameworkVersion值。

然后,在“生成参数”部分中,我已配置了以下参数:

输入图像描述

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

<files>
    <file src="bin\release\v3.5\*.*" target="lib\net35" />
    <file src="bin\release\v4.0\*.*" target="lib\net40" />
</files>

1
因为您花时间编写了完整的手册,所以我会给两个答案都点赞。 - stijn
这里有另一种方式,不涉及任何TeamCity参数,完全使用Visual Studio项目构建配置、nuspec和Team City build进行:https://dev59.com/fZvga4cB1Zd3GeqP46Jk#40111795 - Robin French

14
以下是采用第二种方法的解决方案:
该项目包含以下构建配置和模板:

enter image description here

共享构建号生成器是链中的第一个构建。它除了创建依赖构建将共享的构建号外,不做任何其他事情。我正在使用由Nicholas Williams引用的TeamCity插件Shared Build Number
以下是构建模板中值得注意的配置:

enter image description here

请注意,构建号来自上述共享构建号生成器的构建ID。因此,在我的情况下,该构建的ID为14。还要注意artifact路径中的%TargetFrameworkVersion%变量。幸运的是,TeamCity几乎在任何地方都支持变量插值。
为了使模板利用构建号,它必须具有对该构建配置的快照依赖关系:

enter image description here

最后(关于模板),构建参数几乎与我首选解决方案中的参数相同。请注意,这里有一个额外的配置参数。这是将被继承的构建配置所覆盖的内容:

enter image description here

然后,在依赖的构建中,您必须连接一个快照依赖项,以便继承自模板的构建编号实际起作用,并且还要依赖于共享构建号构建配置:

enter image description here

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

enter image description here

有了实际的构建配置,您现在可以配置NuGet打包构建配置。 您不需要连接到VCS根:

enter image description here

但是您需要配置一堆依赖项(包括快照和构件):

enter image description here

最后,你完成了。


1
我遇到了相同的问题,使用了你的解决方案的一个版本。但是,在我正在构建的组件使用NuGet包时,出现了问题。我针对v4.0和v4.5进行了定位,并且我依赖于EntityFramework 6.x。当我构建我的4.0版本的MY package时,我希望它使用相同版本的EF。我还没有尝试不同的重新安装方案,但是从我的研究来看,它们似乎存在缺陷。 - bigfoot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接