You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用MSBuild覆盖TeamCity系统变量的值?

从程序集版本同步TeamCity构建编号的实现方案

我来分享下怎么把程序集里的版本号提取出来,自动设置成TeamCity的构建编号,刚好对应你给出的配置细节:

TeamCity 端配置

首先在TeamCity里,把构建编号格式设置为:

%system.BuildVersion%

这里的BuildVersion是一个系统级参数,我们需要通过MSBuild脚本把程序集版本传递给它,TeamCity会自动识别这个参数并替换到构建编号里。

MSBuild 脚本实现

接下来是核心的MSBuild脚本部分,用来提取程序集版本并传递给TeamCity:

1. 读取程序集版本信息

首先用GetAssemblyIdentity任务读取目标程序集的版本:

<GetAssemblyIdentity AssemblyFiles="$(PPTCompiledOutputDirPath)\$(FileNameForAssembly)">
  <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity"/>
</GetAssemblyIdentity>

这个任务会把指定路径下程序集的版本信息读取到AssemblyIdentity项中,后续我们可以通过%(AssemblyIdentity.Version)来获取完整的版本字符串(比如2.1.3.456)。

2. 提取目标版本段

接下来用正则表达式提取我们需要的版本部分(比如前三位主版本.次版本.修订版本):

<PropertyGroup>
  <!-- 匹配版本号的前三位,比如从2.1.3.456里提取2.1.3 -->
  <Pattern>(\d+)\.(\d+)\.(\d+)\.</Pattern>
  <In>%(AssemblyIdentity.Version)</In>
  <!-- 调用.NET正则类提取并处理版本号,去掉末尾的点 -->
  <OutVersion>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)).Groups[0].Value.TrimEnd('.'))</OutVersion>
</PropertyGroup>

这里的正则可以根据你的版本格式调整,如果你的版本是其他结构,修改Pattern即可。

3. 传递版本到TeamCity

最后一步是把提取到的版本号发送给TeamCity,通过TeamCity的服务消息格式来设置系统参数:

<Message Text="##teamcity[setParameter name='system.BuildVersion' value='$(OutVersion)']" Importance="High" />

这条消息是TeamCity专属的格式,执行后会自动把OutVersion的值赋值给system.BuildVersion参数,这样TeamCity的构建编号就会自动用上这个版本号了。

注意事项

  • 确保$(PPTCompiledOutputDirPath)和$(FileNameForAssembly)这两个MSBuild属性已经正确定义,准确指向你的编译后程序集路径
  • 如果你的版本号格式不是x.x.x.x,需要调整正则表达式Pattern来匹配对应的结构
  • 要保证这段MSBuild脚本在TeamCity的构建流程中被执行,比如把它嵌入到项目的.csproj文件里,或者作为单独的.targets文件引入

内容的提问来源于stack exchange,提问作者Sujeet Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:33:58