从.csproj读取版本定义NuGet包版本遇空格及Trim报错问题排查
解决Azure Pipeline读取csproj版本号的空格与Trim报错问题
问题根源
你的脚本里直接取$csproj.Project.PropertyGroup.Version大概率拿到的不是单个字符串——如果你的csproj里有多个<PropertyGroup>节点(比如对应Debug/Release的不同配置组),这个操作会返回一个XmlNode集合,而非单个版本文本。这就导致两个问题:
- 调用
.Trim()时,集合对象没有这个方法,直接报错 - 不调用Trim时,集合转字符串会引入额外空格,最终导致NuGet包路径里版本号后带空格
修复脚本
直接用XPath精准定位Version节点,确保拿到纯净的版本字符串:
- powershell: | [xml]$csproj = Get-Content "$(Build.SourcesDirectory)\EvolutionCommon\EvolutionCommon.csproj" # 用XPath直接找到所有Version节点中的第一个,取它的文本内容 $version = $csproj.SelectSingleNode("//Version").InnerText.Trim() Write-Host "Version from csproj: '$version'" Write-Host "##vso[task.setvariable variable=csprojVersion]$version" displayName: 'Extract version from .csproj' - script: | echo "Version used: '|$(csprojVersion)|'" displayName: 'Check csprojVersion value' - script: | nuget.exe push "$(Build.ArtifactStagingDirectory)\EvolutionCommon.$(csprojVersion).nupkg"
备选方案(针对多PropertyGroup场景)
如果明确知道要取哪个PropertyGroup的版本,也可以指定索引:
- powershell: | [xml]$csproj = Get-Content "$(Build.SourcesDirectory)\EvolutionCommon\EvolutionCommon.csproj" # 取第一个PropertyGroup里的Version $version = $csproj.Project.PropertyGroup[0].Version.InnerText.Trim() Write-Host "Version from csproj: '$version'" Write-Host "##vso[task.setvariable variable=csprojVersion]$version" displayName: 'Extract version from .csproj'
验证方式
通过中间的Check csprojVersion value任务,看输出的Version used: '|1.0.2|'里,版本号前后有没有多余空格,确认修复效果。
内容的提问来源于stack exchange,提问作者Mania
相关产品推荐
相关产品推荐

