如何在Azure DevOps Pipeline中更新C++项目程序集版本
C++ 项目 Azure DevOps 构建自动更新.rc文件版本方案
不用安装任何第三方扩展,直接用Pipeline原生能力就能实现,稳定性远高于第三方插件,不会出现兼容失效问题。
实现步骤
- 第一步:配置版本生成规则
在Pipeline的变量配置页自定义版本规则,通用配置是固定主、次版本号,后两位用Azure DevOps自带的构建ID、构建计数自动生成,比如1.1.$(Build.BuildId).0,可以根据自己的版本命名要求调整。 - 第二步:添加预处理脚本任务
在C++项目编译任务(MSBuild/VSBuild)之前,加一个内联PowerShell任务,脚本通过正则匹配替换.rc文件里的版本字段,不依赖固定行号,后续rc文件新增其他内容也不会导致替换失效。
内联脚本内容如下,记得把脚本里的rc文件路径改成你项目里的实际路径:# 替换为你的.rc文件在仓库中的相对路径 $rcPath = "$(Build.SourcesDirectory)/src/MyApp/MyApp.rc" # 拼接生成新版本号,可自行调整规则 $targetVersion = "1.1.$(Build.BuildId).0" # 读取rc文件原始内容 $fileContent = Get-Content $rcPath -Raw # 替换字符串块里带引号的FileVersion、ProductVersion字段 $fileContent = $fileContent -replace '(VALUE\s+"FileVersion",\s+")([\d\.]+)(")', "`$1$targetVersion`$3" $fileContent = $fileContent -replace '(VALUE\s+"ProductVersion",\s+")([\d\.]+)(")', "`$1$targetVersion`$3" # 标准rc文件头部还有不带引号的数值型版本定义,如果你文件里有这两个字段,取消下面两行注释同步替换 # $numericVersion = $targetVersion.Replace('.', ',') # $fileContent = $fileContent -replace '(FILEVERSION\s+)([\d,]+)', "`$1$numericVersion" # $fileContent = $fileContent -replace '(PRODUCTVERSION\s+)([\d,]+)', "`$1$numericVersion" # 写回修改后的内容 Set-Content $rcPath -Value $fileContent -NoNewline - 第三步:正常执行编译任务
脚本跑完后再执行原来的C++编译流程即可,编译出来的exe/dll文件版本会自动使用新生成的版本号。
注意事项
- 脚本默认用UTF-8编码写回,如果你的rc文件是GBK/UTF-16编码,给
Set-Content加-Encoding参数指定对应编码就行,避免编译时出现编码错误。 - 本地用Visual Studio开发构建时,这个Pipeline脚本不会运行,rc文件里保留你原来配置的默认版本,不影响本地开发调试。
- 你之前用的第三方版本插件大多是为C#项目的AssemblyInfo文件设计,对C++ .rc文件的格式、编码适配很差,很容易出现匹配不到字段、改坏文件格式的问题,原生脚本完全可控,没有这类兼容问题。
内容的提问来源于stack exchange,提问作者Sai Vamsi
相关产品推荐
相关产品推荐

