21

我读过的职位的少数(见下面的参考资料),还没有找到最佳实践指南,是专门针对我的技术堆栈。有没有推荐的方法来配置NuGet包使用的MSBuild在TeamCity的针对多个框架?

目标:使用MSBuild和NuGet通过TeamCity创建一个单一的NuGet包,其目标是通过一个.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 pack步骤能够基于.nuspec文件中的Files部分完成它的工作。

  2. 创建多个构建配置。按照上面概述的构建步骤构建一个配置。使用这种方法,很容易解决TargetFrameworkVersion和OutputPath构建参数问题,但是现在我必须创建快照依赖性并在构建中共享程序集版本号。它也吃了构建配置插槽,因为我们确实有一个企业许可证这是确定(但不是最优的)我们。

选项#1似乎是明显的选择。选项#2感觉脏。

所以我的两个问题是:

  1. 是否有可能创建出独特的生成步骤的参数?
  2. 有没有第三种更好的方法?

参考文献:

  1. Multi-framework NuGet build with symbols for internal dependency management
  2. Nuget - packing a solution with multiple projects (targeting multiple frameworks)
  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
+0

我已经实现了两种方法的解决方案,并会尽快发布单独的答案(如时间允许)。 – 2013-04-15 21:31:12

+0

我正在等待着诱饵的呼吸;-)巧合的是我只是有相同的要求。 – 2013-04-17 02:00:17

+0

哈哈,蒂姆。我从组装信息youtrack讨论中识别出你的名字(http://youtrack.jetbrains.com/issue/TW-27596)。你和我正在遵循同样的问题。我会尽力在本周发布我的两个答案。 ;) – 2013-04-17 02:52:49

回答

24

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

魔术依赖于一个不幸的解决方法。如果你愿意做出妥协,这个解决方案确实有效。如果你不是,你可以按照the issue that I opened on JetBrains' issue tracker

单生成配置是这样的:

enter image description here

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

然后,在构建参数部分,我已经配置下列参数:

enter image description here

最后,的NuGet包的步骤根据我.nuspec的文件部分做的文件路径翻译:

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

+1这两个答案,因为你花时间写一个完整的手册 – stijn 2013-07-12 09:46:13

+0

这里是另一种不涉及任何TeamCity参数的方法,完全使用Visual Studio项目构建配置,nuspec和Team City构建完成:http:// stackoverflow.com/questions/40046710/teamcity-nuget-package-build-for-different-net-frameworks/40111795 – 2016-10-26 18:02:59

14

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

该项目包含以下生成的配置和模板:

enter image description here

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

这里是在构建模板显着的配置:

enter image description here

注意版本号从共享的版本ID来构建数发生器如上所述。因此,就我而言,该构建的ID为14.还要注意工件路径中的变量%TargetFrameworkVersion%。幸运的是,TeamCity几乎支持各种插值。

为了使模板利用内部版本号,它必须有对构建配置的快照依赖:(关于模板)

enter image description here

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

enter image description here

然后,在相关的版本,您必须连接起来快照依赖关系,内部版本号(从模板继承)实际上也适用服用上的共享版本号构建配置的依赖关系:

enter image description here

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

enter image description here

通过配置实际版本,您现在可以配置NuGet pack版本配置。你并不需要连接到一个VCS根:

enter image description here

但是,你需要配置了一堆的依赖(包括快照和神器):

enter image description here

最后,你完成了。

+1

我有同样的问题,并使用您的解决方案的版本。但是,当我所构建的组件使用NuGet包时,我遇到了问题。我的目标是v4.0和v4.5,并且我对EntityFramework 6.x有依赖性。当我构建我的4.0版本的MY包时,我希望它使用相同版本的EF。我还没有尝试过不同的重新安装场景,但从我的研究来看,他们似乎有缺陷。 – bigfoot 2014-02-17 13:02:11

相关问题