代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

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

  •  20
  • Lasse V. Karlsen  · 技术社区  · 15 年前

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

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

    我找到的“教程”都说“你只是把这个添加到脚本中”,但他们没有说 哪一个 脚本和“this”通常指的是来自msbuild社区扩展的assemblyinfo任务。

    是否需要生成自定义的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是从哪个构建的。

    2 回复  |  直到 13 年前
        1
  •  18
  •   Wim    15 年前

    csproj文件实际上是一个msbuild文件。

    在vs.net中卸载相关的类项目,编辑它并取消注释 BeforeBuild 目标。添加 FileUpdate 来自msbuild社区扩展的msbuild任务。

    在msbuild文件中,可以使用环境变量从teamcity中检索内部版本号 $(build_vcs_number_1) . 请注意,您可能需要为检查的“生产”条件创建一个额外的配置,因为当您在本地构建时,这显然不起作用。

    只需将其用作文件更新任务的输入 ReplacementText 财产。

    请注意,如果您的修订号高于65535标记( UInt16 )中不能使用它 AssemblyVersion 属性。

    不过,我建议你用的是 AssemblyInformationalVersion ,它只是一个不具有该限制的字符串。当然,除非你确信你不会达到修订版的上限,但这似乎是一种不明智的做法。

    或者,您可以设计一种方法(A.B.C.D是您的版本号),使用Revision DIV 1000 for C和Revision mod 1000 for D。

        2
  •  12
  •   Fried Hoeben    13 年前

    在TeamCity 6.5中,这是 很容易 实现使用 AssemblyInfo patcher .

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