我们正在寻找如何在 Visual Studio Team Services 上将 GitHubFlow 与 NuGet 包和自动 NuGet 包创建一起使用的最佳实践。

我们已经使用了 VSTS“dotnet pack”命令
使用 VSTS 进行 NuGet 自动版本控制-LMLPHP

但是如何自动定义 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'

10-08 17:42