DevOps中.NET 6类库基于csproj主/次版本自动生成补丁版本
自动生成NuGet包补丁版本(沿用主/次版本)
一、修改CSPROJ文件
将固定版本号替换为版本前缀,让流水线动态生成补丁号:
<Project Sdk="Microsoft.NET.Sdk"> <!-- 其他原有配置保持不变 --> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <PackageId>MyProject.Libraries.Azure</PackageId> <!-- 替换原固定<Version>为版本前缀 --> <VersionPrefix>6.1</VersionPrefix> <Authors>Me</Authors> <Company>MyCompany</Company> <Product>MyProject.Libraries.Azure</Product> </PropertyGroup> <!-- 其他原有配置保持不变 --> </Project>
二、调整Azure DevOps流水线YAML
移除冗余的Web部署构建任务,改用DotNetCLI完成还原、构建、打包,并通过环境变量传递自动生成的完整版本号:
trigger: - main - feature/* - bugfix/* pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' # 与CSPROJ中的VersionPrefix保持一致 versionPrefix: '6.1' # 用Azure DevOps自动递增的BuildId作为补丁号,确保版本唯一 fullVersion: '$(versionPrefix).$(Build.BuildId)' steps: - task: DotNetCoreCLI@2 displayName: 还原NuGet依赖 inputs: command: 'restore' projects: '$(solution)' - task: DotNetCoreCLI@2 displayName: 构建项目 inputs: command: 'build' projects: '$(solution)' arguments: '-c $(buildConfiguration) --no-restore' - task: DotNetCoreCLI@2 displayName: 生成NuGet包 inputs: command: 'pack' packagesToPack: '**/*.csproj' versioningScheme: 'byEnvVar' versionEnvVar: 'fullVersion' arguments: '-c $(buildConfiguration) -o $(Build.ArtifactStagingDirectory) --no-build'
可选:用Git提交次数作为补丁号
如果不想用BuildId,可添加PowerShell任务获取Git提交次数作为补丁号,替换上述变量部分:
variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' versionPrefix: '6.1' steps: - task: PowerShell@2 displayName: 获取Git提交次数 inputs: targetType: 'inline' script: | $commitCount = git rev-list --count HEAD Write-Host "##vso[task.setvariable variable=fullVersion]$(versionPrefix).$commitCount" # 后续还原、构建、打包任务保持不变
注意事项
- 必须移除CSPROJ中的
<Version>节点,否则会覆盖流水线生成的版本号 Build.BuildId是Azure DevOps全局变量,每次构建自动递增,保证版本唯一- 生成的NuGet包版本格式为
6.1.x,x为自动生成的补丁号,推送后会在NuGet包管理器中显示为更新版本
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

