我想调整我的类库的TeamCity构建配置的输出,以便生成的dll文件具有以下版本号:3.5.0.x,其中x是TeamCity拾取的subversion版本号。< / p>
我发现我可以使用BUILD_NUMBER
环境变量来获取x,但遗憾的是我不明白我还需要做什么。
“教程”我发现所有人都说“你只是将它添加到脚本中”,但是他们没有说哪个脚本,而“this”通常是指来自的那个AssemblyInfo任务MSBuild社区扩展。
我是否需要以某种方式构建自定义MSBuild脚本才能使用它? “脚本”是否与解决方案文件或C#项目文件相同?
我根本不了解MSBuild进程,除了我可以直接将解决方案文件传递给MSBuild,但是我需要添加到“脚本”的是XML,而解决方案文件肯定不看像XML一样。
那么,有人能指出我如何使这项工作分步指导吗?
这就是我最终的结果:
编辑我的核心类库的.csproj文件,并更改底部,使其显示为:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
<AssemblyInfo Condition=" '$(BUILD_NUMBER)' != '' "
CodeLanguage="CS"
OutputFile="$(MSBuildProjectDirectory)\..\GlobalInfo.cs"
AssemblyVersion="3.5.0.0"
AssemblyFileVersion="$(BUILD_NUMBER)" />
</Target>
<Target Name="AfterBuild">
更改我的所有AssemblyInfo.cs文件,以便它们不指定AssemblyVersion或AssemblyFileVersion(回想起来,我会考虑将AssemblyVersion放回去)
现在只有在设置环境变量BUILD_NUMBER时才会更新GlobalInfo.cs,这是我通过TeamCity构建的时候。
我选择保持AssemblyVersion不变,因此引用仍然有效,并且只更新AssemblyFileVersion,以便我可以看到dll来自哪个版本。
答案 0 :(得分:18)
CSPROJ文件实际上是一个MSBuild文件。
在VS.NET中卸载相关的类项目,编辑它并取消注释BeforeBuild
目标。从MSBuild社区扩展中添加FileUpdate
MSBuild任务。
在MSBuild文件中,您可以使用环境变量$(build_vcs_number_1)
从TeamCity检索BUILD_NUMBER。请注意,您可能希望为“生产”创建一个额外的配置,其中包含您要检查的条件,因为当您在本地构建时,这显然不起作用。
只需将其用作FileUpdate任务的ReplacementText
属性的输入。
请注意,如果您的修订版数字高于65535分(UInt16
),则无法在AssemblyVersion
属性中使用它。
我建议你使用的是AssemblyInformationalVersion
,这只是一个没有这个限制的字符串。当然,除非你确信你不会达到这个修订版的上限,但这似乎是一种狡猾的方式。
或者,你可以设计一种方法(a.b.c.d是你的版本号),使用修订版div 1000代表c和修订版mod 1000代表d。
答案 1 :(得分:12)
在TeamCity 6.5中,使用AssemblyInfo patcher 非常容易。
%system.build.number%