WPF项目如何通过Azure Pipeline追加构建号更新AssemblyVersion?
Azure Pipeline中实现构建号追加到AssemblyVersion的解决方案
问题背景
现有WPF项目托管在Azure Repo分支中,项目Properties目录下的CommonAssemblyInfo.cs配置如下:
[assembly: AssemblyVersion("1.2.0.1")] [assembly: AssemblyFileVersion("1.2.0.1")]
尝试在azure-pipelines.yml的build阶段后添加Versioning阶段,使用Assembly-Info-NetFramework@3任务更新版本,但任务未生效,需求是提交新代码时将Azure Pipeline构建号追加到AssemblyVersion中。
问题原因分析
- 阶段顺序错误:Versioning阶段放在build之后,此时项目已完成编译,修改
CommonAssemblyInfo.cs无法影响已生成的程序集。 - 变量引用语法错误:配置中使用了
${Build.BuildNumber},Azure Pipeline变量的正确引用格式应为$(Build.BuildNumber)。 - 路径分隔符问题:Windows风格的
**\CommonAssemblyInfo.cs在跨平台代理(如Linux)下可能无法正确匹配文件。 - InsertAttributes参数配置不当:文件已存在AssemblyVersion属性,设为
true会尝试插入新属性而非替换现有值。
解决方案
1. 调整阶段顺序
将Versioning阶段移至build阶段之前,确保更新程序集版本后再执行编译。
2. 修正任务配置
修改Assembly-Info-NetFramework@3任务的关键参数,确保能正确替换现有版本:
- 变量引用改为
$(Build.BuildNumber) - 路径分隔符改为跨平台兼容的
**/CommonAssemblyInfo.cs - 将
InsertAttributes设为false,直接替换现有属性
3. 配置符合要求的构建号格式
程序集版本要求为X.Y.Z.W四段数字格式,需在yml开头定义构建号规则,例如:
name: '1.2.0.$(Build.BuildId)'
这里用Build.BuildId(自增的构建ID)作为版本号的第四段,确保每次构建版本唯一。
完整的yml示例
# 定义构建号格式,符合程序集版本四段数字要求 name: '1.2.0.$(Build.BuildId)' stages: - stage: Versioning displayName: '自动更新版本' jobs: - job: Update_Assembly_Version steps: - task: Assembly-Info-NetFramework@3 inputs: Path: '$(Build.SourcesDirectory)' FileNames: '**/CommonAssemblyInfo.cs' InsertAttributes: false FileEncoding: 'auto' WriteBOM: false Title: 'Update AssemblyVersion for WFE' Product: 'WFE' VersionNumber: '$(Build.BuildNumber)' FileVersionNumber: '$(Build.BuildNumber)' InformationalVersion: '$(Build.BuildNumber)' LogLevel: 'verbose' FailOnWarning: false DisableTelemetry: false - stage: Build displayName: '构建WPF项目' dependsOn: Versioning jobs: - job: Build_Project steps: - task: NuGetCommand@2 inputs: restoreSolution: '**/*.sln' - task: MSBuild@1 inputs: solution: '**/*.sln' platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)'
进阶:基于现有版本追加构建号
如果需要保留现有版本的前三段,仅将构建号作为第四段,可通过PowerShell脚本先读取现有版本,再拼接构建号:
在Versioning阶段添加PowerShell步骤:
# 读取现有AssemblyVersion的前三段 $assemblyInfoPath = Join-Path $(Build.SourcesDirectory) "Properties\CommonAssemblyInfo.cs" $versionMatch = Get-Content $assemblyInfoPath | Select-String 'AssemblyVersion\("([0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+"\)' $baseVersion = $versionMatch.Matches.Groups[1].Value # 拼接新版本号 $newAssemblyVersion = "$baseVersion.$(Build.BuildId)" # 设置为管道变量 Write-Host "##vso[task.setvariable variable=assemblyVersion;]$newAssemblyVersion"
然后在Assembly-Info任务中引用该变量:
VersionNumber: '$(assemblyVersion)'
内容的提问来源于stack exchange,提问作者Rashedul.Rubel
相关产品推荐
相关产品推荐

