【问题标题】:Making TeamCity integrate the Subversion build number into the assembly version使 TeamCity 将 Subversion 内部版本号集成到程序集版本中
【发布时间】:2011-01-02 22:14:39
【问题描述】:

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

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

我发现所有的“教程”都说“你只需将这个添加到脚本中”,但他们没有说 哪个 脚本,而“这个”通常是指来自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. 确保此文件只构建一次,以便我在源代码管理中有一个默认文件

现在只有在设置了环境变量 BUILD_NUMBER 时才会更新 GlobalInfo.cs,这就是我通过 TeamCity 构建的时候。

我选择保持 AssemblyVersion 不变,这样引用仍然有效,并且只更新 AssemblyFileVersion,这样我就可以看到 dll 来自哪个构建。

【问题讨论】:

    标签: svn msbuild continuous-integration version teamcity


    【解决方案1】:

    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。

    【讨论】:

      【解决方案2】:

      在 TeamCity 6.5 中,使用 AssemblyInfo patcher 实现这一点非常容易

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

      【讨论】:

      • 不幸的是,他们的修补程序不允许 currently 指定不同的 AssemblyVersionAssemblyFileVersion 值。
      • 您的建议在主要关注的是能够跟踪内部版本号的情况下非常有用:谢谢!
      • 伙计,我正要编写很多 scheiss 样板代码,只是为了将其放入我的代码中。您为我节省了 2 或 3 天的工作时间!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 2016-02-03
      • 2013-03-18
      • 2011-04-20
      • 2011-02-20
      • 2014-04-09
      相关资源
      最近更新 更多