如何使用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
相关产品推荐
相关产品推荐

