Azure DevOps构建流水线:无法从csproj获取NuGet版本及PR包后缀配置
在Azure DevOps PR构建中为NuGet包添加-unstable后缀并获取csproj版本号
1. 从csproj提取版本号
使用dotnet msbuild命令直接读取项目的Version属性,无需手动解析XML,简单可靠:
$version = dotnet msbuild 你的项目路径/ClassLibrary.csproj /getproperty:Version /nologo
/getproperty:Version指定读取项目的Version属性值/nologo屏蔽冗余输出,仅返回纯净的版本号字符串
2. 判断PR构建并添加版本后缀
Azure DevOps提供预定义变量Build.Reason,当构建由拉取请求触发时,该变量值为PullRequest。结合这个变量处理版本号:
if ($env:Build_Reason -eq "PullRequest") { $packageVersion = "$version-unstable" } else { $packageVersion = $version } # 将处理后的版本号设为流水线全局变量,供后续任务调用 Write-Host "##vso[task.setvariable variable=PackageVersion;]$packageVersion"
3. 用处理后的版本号打包NuGet包
在DotNetCoreCLI打包任务中,通过环境变量传入自定义版本号:
- task: DotNetCoreCLI@2 inputs: command: 'pack' packagesToPack: '**/ClassLibrary.csproj' # 匹配你的项目文件路径 versioningScheme: 'byEnvVar' versionEnvVar: 'PackageVersion' # 使用上面步骤生成的版本变量 configuration: 'Release'
完整YAML流水线示例
trigger: - main # 主分支触发的正式构建不添加后缀 pr: - main # 监听main分支的PR构建 steps: - task: PowerShell@2 name: ExtractAndModifyVersion inputs: targetType: 'inline' script: | # 替换为你的项目在代码仓库中的相对路径 $projPath = "$(Build.SourcesDirectory)/src/YourLibrary/YourLibrary.csproj" $version = dotnet msbuild $projPath /getproperty:Version /nologo if ($env:Build_Reason -eq "PullRequest") { $packageVersion = "$version-unstable" } else { $packageVersion = $version } Write-Host "最终NuGet包版本:$packageVersion" Write-Host "##vso[task.setvariable variable=PackageVersion;]$packageVersion" - task: DotNetCoreCLI@2 inputs: command: 'pack' packagesToPack: '**/YourLibrary.csproj' versioningScheme: 'byEnvVar' versionEnvVar: 'PackageVersion' configuration: 'Release' outputDir: '$(Build.ArtifactStagingDirectory)' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'nuget-packages' publishLocation: 'Container'
注意事项
- 确保你的csproj文件中显式定义了
<Version>节点,否则dotnet msbuild会返回默认版本1.0.0:<PropertyGroup> <Version>1.2.3</Version> <!-- 必须显式声明版本号 --> <TargetFramework>net6.0</TargetFramework> </PropertyGroup> - 根据你的项目目录结构,调整
projPath和packagesToPack的路径匹配规则
内容的提问来源于stack exchange,提问作者Kagemand Andersen
相关产品推荐
相关产品推荐

