使TeamCity将Subversion内部版本号集成到程序集版本中

时间:2010-01-08 13:34:57

标签: svn msbuild continuous-integration version teamcity

我想调整我的类库的TeamCity构建配置的输出,以便生成的dll文件具有以下版本号:3.5.0.x,其中x是TeamCity拾取的subversion版本号。< / p>

我发现我可以使用BUILD_NUMBER环境变量来获取x,但遗憾的是我不明白我还需要做什么。

“教程”我发现所有人都说“你只是将它添加到脚本中”,但是他们没有说哪个脚本,而“this”通常是指来自的那个AssemblyInfo任务MSBuild社区扩展。

我是否需要以某种方式构建自定义MSBuild脚本才能使用它? “脚本”是否与解决方案文件或C#项目文件相同?

我根本不了解MSBuild进程,除了我可以直接将解决方案文件传递给MSBuild,但是我需要添加到“脚本”的是XML,而解决方案文件肯定不看像XML一样。

那么,有人能指出我如何使这项工作分步指导吗?


这就是我最终的结果:

  1. 安装MSBuild Community Tasks
  2. 编辑我的核心类库的.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">
    

  3. 更改我的所有AssemblyInfo.cs文件,以便它们不指定AssemblyVersion或AssemblyFileVersion(回想起来,我会考虑将AssemblyVersion放回去)

  4. 添加了一个指向位于所有项目外的全球GlobalInfo.cs的链接
  5. 确保此文件构建一次,以便我在源代码管理中有一个默认文件
  6. 现在只有在设置环境变量BUILD_NUMBER时才会更新GlobalInfo.cs,这是我通过TeamCity构建的时候。

    我选择保持AssemblyVersion不变,因此引用仍然有效,并且只更新AssemblyFileVersion,以便我可以看到dll来自哪个版本。

2 个答案:

答案 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 非常容易

  • 转到构建配置步骤3“构建步骤”;
  • 点击“添加构建功能”;
  • 选择要素类型“AssemblyInfo修补程序”;
  • 指出您想要的版本。我使用:%system.build.number%