You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:15:38