我们正在寻找如何在 Visual Studio Team Services 上将 GitHubFlow 与 NuGet 包和自动 NuGet 包创建一起使用的最佳实践。
我们已经使用了 VSTS“dotnet pack”命令
但是如何自动定义 Major.Minor.Release 呢?
我们不想在 *.csproj 或存储库中使用这些变量,因为这不适用于 Pull Requests。
目前的最佳实践是什么?
最佳答案
您可以在 Azure DevOps(以前称为 VSTS)中的单个管道中完成所有这些操作。如果您使用的是 git 存储库,我强烈建议使用 GitVersion 来自动确定下一个版本号。您可以在此处将其添加为构建任务:https://marketplace.visualstudio.com/items?itemName=gittools.gitversion
在您的存储库中,我建议您将 GitVersion 配置为在该存储库的“主线”模式下运行,这样每次提交时,您的版本都会自动递增 +1,例如1.0.1、1.0.2、1.0.3。不过,您始终可以将提交标记为特定修订。要设置 Mainline 模式,只需在存储库“GitVersion.yml”的根目录中放置一个文件,内容为“mode: Mainline”。这只适用于 GitVersion v4.0+
返回 Azure DevOps 管道,在解决方案构建之后、nuget pack 命令之前运行 GitVersion 任务。一旦 GitVersion 任务运行,您将可以访问它创建的变量,您可以在 nuget 包选项中使用这些变量。
在 Nuget“Pack Options”下,将 Automatic package versioning 设置为“Use an environment variable”,然后使用变量“GitVersion_NuGetVersion”
GitVersion 开箱即用非常好,特别是对于 GitFlow 和 GitHub Flow,但您可能需要阅读文档。 http://gitversion.readthedocs.io/en/latest/
您将在下面找到一个执行整个管道过程的示例 YAML 文件。除了从 GitVersion 获取版本号以及配置要推送到的 nuget 服务器之外,大多数都是开箱即用的。
pool:
name: Default
demands:
- msbuild
- visualstudio
- vstest
steps:
- task: gittools.gitversion.gitversion-task.GitVersion@4
displayName: GitVersion
inputs:
updateAssemblyInfo: true
- task: NuGetToolInstaller@0
displayName: 'Use NuGet 4.3.0'
- task: NuGetCommand@2
displayName: 'NuGet restore'
inputs:
restoreSolution: '$(Parameters.solution)'
- task: VSBuild@1
displayName: 'Build solution **\*.sln'
inputs:
solution: '$(Parameters.solution)'
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
- task: VSTest@2
displayName: 'VsTest - testAssemblies'
inputs:
testAssemblyVer2: |
**\$(BuildConfiguration)\*test*.dll
!**\obj\**
platform: '$(BuildPlatform)'
configuration: '$(BuildConfiguration)'
- task: NuGetCommand@2
displayName: 'NuGet pack'
inputs:
command: pack
versioningScheme: byEnvVar
versionEnvVar: 'GitVersion_NuGetVersion'
- task: NuGetCommand@2
displayName: 'NuGet push'
inputs:
command: push
packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg'
nuGetFeedType: external
publishFeedCredentials: 'Your NuGet Server'