有没有推荐的方法来配置NuGet包使用的MSBuild在TeamCity的针对多个框架?
我读过的职位的少数(见下面的参考资料),还没有找到最佳实践指南,是专门针对我的技术堆栈。有没有推荐的方法来配置NuGet包使用的MSBuild在TeamCity的针对多个框架?
目标:使用MSBuild和NuGet通过TeamCity创建一个单一的NuGet包,其目标是通过一个.csproj文件构建的多个.NET框架。
约束:
- 代码从VCS拉只有一次。
- 所有编译组件时,应当进行版本相同。
- 单.csproj的(而不是每个目标框架)。
我心里有两种方法:
创建一个单一的生成配置。它将包含三个构建步骤:编译.NET 3.5,编译.NET 4.0,包装NuGet。每个构建步骤都取决于最后的成功。我用这种方法看到的唯一真正的问题(希望有一个我不知道的解决方案)是每个构建步骤都需要它自己的一组构建参数(例如,system.TargetFrameworkVersion和system.OutputPath)来指定DLL的独特位置(例如,bin \ release \ v3.5和bin \ release \ v4.0),以便NuGet pack步骤能够基于.nuspec文件中的Files部分完成它的工作。
创建多个构建配置。按照上面概述的构建步骤构建一个配置。使用这种方法,很容易解决TargetFrameworkVersion和OutputPath构建参数问题,但是现在我必须创建快照依赖性并在构建中共享程序集版本号。它也吃了构建配置插槽,因为我们确实有一个企业许可证这是确定(但不是最优的)我们。
选项#1似乎是明显的选择。选项#2感觉脏。
所以我的两个问题是:
- 是否有可能创建出独特的生成步骤的参数?
- 有没有第三种更好的方法?
参考文献:
- Multi-framework NuGet build with symbols for internal dependency management
- Nuget - packing a solution with multiple projects (targeting multiple frameworks)
- http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/
- http://msdn.microsoft.com/en-us/library/hh264223.aspx
- https://stackoverflow.com/a/1083362/607701
- http://confluence.jetbrains.com/display/TCD7/Configuring+Build+Parameters
- http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package
这是我的优选解决方案(选项#1):
魔术依赖于一个不幸的解决方法。如果你愿意做出妥协,这个解决方案确实有效。如果你不是,你可以按照the issue that I opened on JetBrains' issue tracker。
单生成配置是这样的:
注意的前两个构建步骤的名称。事实上,它们分别被明确命名为.NET 3.5和4.0的TargetFrameworkVersion值。
然后,在构建参数部分,我已经配置下列参数:
最后,的NuGet包的步骤根据我.nuspec的文件部分做的文件路径翻译:
<files>
<file src="bin\release\v3.5\*.*" target="lib\net35" />
<file src="bin\release\v4.0\*.*" target="lib\net40" />
</files>
+1这两个答案,因为你花时间写一个完整的手册 – stijn 2013-07-12 09:46:13
这里是另一种不涉及任何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
这里是采取第二种方法的解决方案:
该项目包含以下生成的配置和模板:
的共享版本号生成器是链中的第一个版本。除了创建依赖版本将共享的内部版本号之外,它什么也不做。我使用Nicholas Williams提供的TeamCity引用的插件Shared Build Number。
这里是在构建模板显着的配置:
注意版本号从共享的版本ID来构建数发生器如上所述。因此,就我而言,该构建的ID为14.还要注意工件路径中的变量%TargetFrameworkVersion%。幸运的是,TeamCity几乎支持各种插值。
为了使模板利用内部版本号,它必须有对构建配置的快照依赖:(关于模板)
最后,构建参数几乎相同到我的首选解决方案中的参数。但是请注意附加的配置参数。这是将被继承构建配置覆盖:
然后,在相关的版本,您必须连接起来快照依赖关系,内部版本号(从模板继承)实际上也适用服用上的共享版本号构建配置的依赖关系:
,当然,你需要设置实际的目标框架:
通过配置实际版本,您现在可以配置NuGet pack版本配置。你并不需要连接到一个VCS根:
但是,你需要配置了一堆的依赖(包括快照和神器):
最后,你完成了。
我有同样的问题,并使用您的解决方案的版本。但是,当我所构建的组件使用NuGet包时,我遇到了问题。我的目标是v4.0和v4.5,并且我对EntityFramework 6.x有依赖性。当我构建我的4.0版本的MY包时,我希望它使用相同版本的EF。我还没有尝试过不同的重新安装场景,但从我的研究来看,他们似乎有缺陷。 – bigfoot 2014-02-17 13:02:11
我已经实现了两种方法的解决方案,并会尽快发布单独的答案(如时间允许)。 – 2013-04-15 21:31:12
我正在等待着诱饵的呼吸;-)巧合的是我只是有相同的要求。 – 2013-04-17 02:00:17
哈哈,蒂姆。我从组装信息youtrack讨论中识别出你的名字(http://youtrack.jetbrains.com/issue/TW-27596)。你和我正在遵循同样的问题。我会尽力在本周发布我的两个答案。 ;) – 2013-04-17 02:52:49