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

Azure Pipeline多项目解决方案版本不一致问题求助

解决Azure Pipeline中多.NET Framework项目独立版本控制问题

问题出在你当前的AssemblyInfoReader任务匹配了所有AssemblyInfo.cs文件,任务执行时会依次读取每个文件的版本信息,但最终生成的$(AssemblyInfo.*)变量会被最后一个读取的文件内容覆盖,导致后续NuGet打包时所有项目都使用最后一个项目的版本号。

方案一:为每个项目单独处理版本读取与打包

利用AssemblyInfoReader任务的variablePrefix参数,为每个项目生成独立的版本变量,再分别执行打包:

steps:
- task: NuGetCommand@2
  displayName: 'NuGet restore'

# 为Project1读取AssemblyInfo,变量前缀设为Project1
- task: kherzog.AssemblyInfoReader.assembly-info-reader-build-task.AssembyInfoReader@3
  displayName: '读取Project1版本信息'
  inputs:
    filePath: '**/Project1/Properties/AssemblyInfo.cs'
    variablePrefix: 'Project1'

# 为Project2读取AssemblyInfo,变量前缀设为Project2
- task: kherzog.AssemblyInfoReader.assembly-info-reader-build-task.AssembyInfoReader@3
  displayName: '读取Project2版本信息'
  inputs:
    filePath: '**/Project2/Properties/AssemblyInfo.cs'
    variablePrefix: 'Project2'

- task: MSBuild@1
  displayName: 'Build solution **/*.sln'

# 打包Project1,使用Project1的版本变量
- task: NuGetCommand@2
  displayName: 'NuGet pack Project1'
  inputs:
    command: pack
    packagesToPack: '**/Project1/*.csproj'
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Project1.AssemblyVersion.Major)'
    minorVersion: '$(Project1.AssemblyVersion.Minor)'
    patchVersion: '$(Project1.AssemblyVersion.Build)'

# 打包Project2,使用Project2的版本变量
- task: NuGetCommand@2
  displayName: 'NuGet pack Project2'
  inputs:
    command: pack
    packagesToPack: '**/Project2/*.csproj'
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Project2.AssemblyVersion.Major)'
    minorVersion: '$(Project2.AssemblyVersion.Minor)'
    patchVersion: '$(Project2.AssemblyVersion.Build)'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'

方案二:用PowerShell脚本批量处理(适合项目较多的场景)

编写PowerShell脚本遍历所有项目的AssemblyInfo.cs,提取版本号后逐个执行NuGet打包:

  1. 在仓库中添加脚本文件PackProjects.ps1:
# 遍历所有AssemblyInfo.cs文件
Get-ChildItem -Path "$(Build.SourcesDirectory)" -Filter "AssemblyInfo.cs" -Recurse | ForEach-Object {
    # 提取项目目录(AssemblyInfo所在的Properties文件夹的父目录)
    $projectDir = $_.Directory.Parent.FullName
    $projectName = $_.Directory.Parent.Name

    # 读取AssemblyVersion
    $assemblyVersion = Select-String -Path $_.FullName -Pattern 'AssemblyVersion\("([^"]+)"\)' | ForEach-Object { $_.Matches.Groups[1].Value }
    $versionParts = $assemblyVersion.Split('.')
    $major = $versionParts[0]
    $minor = $versionParts[1]
    $patch = $versionParts[2]

    # 生成预发布版本号(格式和原Pipeline一致)
    $prereleaseTag = "ci-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
    $packageVersion = "$major.$minor.$patch-$prereleaseTag"

    # 执行NuGet打包
    & nuget pack "$projectDir\$projectName.csproj" -Version $packageVersion -OutputDirectory "$(Build.ArtifactStagingDirectory)"
}
  1. 修改Pipeline步骤:
steps:
- task: NuGetCommand@2
  displayName: 'NuGet restore'

- task: MSBuild@1
  displayName: 'Build solution **/*.sln'

- task: PowerShell@2
  displayName: '批量打包项目'
  inputs:
    filePath: '$(Build.SourcesDirectory)/PackProjects.ps1'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'

注意:确保NuGet已添加到Pipeline的环境变量中,或者在脚本中指定NuGet的完整路径。

内容的提问来源于stack exchange,提问作者Conor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:45:47