Azure Pipeline中PowerShell修改.csproj版本节点报错的解决方法
修复Azure DevOps流水线中更新.csproj版本的PowerShell任务错误
错误原因
你碰到的问题是PowerShell脚本误操作了XML文档的根节点(Document节点)的InnerText属性,而这个属性是只读的。正确做法是精准定位到<Version>节点(或创建该节点)来修改版本值。
正确的PowerShell脚本实现
下面是可直接用于Azure DevOps流水线的脚本,支持修改已有Version节点,或在PropertyGroup下新增Version节点:
# 定义目标版本号,可替换为流水线变量,比如$(Build.BuildNumber) $newVersion = "1.0.$(Build.BuildId)" # 递归遍历所有.csproj文件 Get-ChildItem -Path "$(System.DefaultWorkingDirectory)" -Filter *.csproj -Recurse | ForEach-Object { $xml = [xml](Get-Content $_.FullName) # 优先选择无Condition的PropertyGroup(通常是默认属性组),没有的话取第一个PropertyGroup $propertyGroup = $xml.Project.PropertyGroup | Where-Object { -not $_.Condition } | Select-Object -First 1 if (-not $propertyGroup) { $propertyGroup = $xml.Project.PropertyGroup | Select-Object -First 1 } # 查找Version节点 $versionNode = $propertyGroup.SelectSingleNode("Version") if ($versionNode) { # 已存在Version节点,直接更新值 $versionNode.InnerText = $newVersion Write-Host "更新文件 $($_.FullName) 的版本为: $newVersion" } else { # 不存在Version节点,创建新节点并添加到PropertyGroup $newVersionNode = $xml.CreateElement("Version") $newVersionNode.InnerText = $newVersion $propertyGroup.AppendChild($newVersionNode) | Out-Null Write-Host "在文件 $($_.FullName) 中新增版本节点: $newVersion" } # 保存修改后的XML文件,保留原编码避免乱码 $xml.Save($_.FullName) }
流水线任务配置要点
- 在流水线中添加PowerShell任务,选择“内联脚本”,粘贴上述代码
- 版本号可替换为流水线内置变量(如
$(Build.BuildNumber),需提前在流水线选项中配置版本格式)或自定义变量 - 任务工作目录默认使用
$(System.DefaultWorkingDirectory)即可,对应代码仓库根目录
关键注意事项
- 绝对不要直接操作
$xml(Document节点)的InnerText,必须定位到具体的元素节点 - 保存XML时会自动沿用原文件编码,避免编码问题导致文件损坏
- 脚本优先选择无Condition的PropertyGroup,确保修改的是项目的默认版本属性
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

