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打包:
- 在仓库中添加脚本文件
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)" }
- 修改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
相关产品推荐
相关产品推荐

