使用 Azure Pipelines 发布 NuGet 包(YAML/经典)

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

在 Azure Pipelines 中,可以使用经典编辑器或 YAML 任务将管道中的 NuGet 包发布到 Azure Artifacts 源或公共注册表,例如 nuget.org

创建 NuGet 包

有多种方法可以创建 NuGet 包,例如使用 Visual Studio 打包 NuGet 包。 如果已使用 MSBuild 或其他一些任务创建包,请跳过此部分并跳转到 “发布包 ”部分。

若要创建 NuGet 包,请将以下代码片段添加到管道 YAML 文件。 有关详细信息,请参阅 NuGet 任务

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack:搜索要打包的 csproj 目录的模式
  • packDestination:将在其中创建包的目录

TFS 不支持 YAML。

包版本控制

NuGet 包的名称和版本号标识。 建议使用语义版本控制对包进行版本控制。 语义版本有三个数值组件: 主要次要修补程序

修复 bug 后,修补程序通常会递增, (例如 1.0.0 ->1.0.1) 。 发布新的后向兼容功能时,将次要版本递增,并将修补程序版本重置为 0 (,例如 1.4.17 ->1.5.0) 。 进行向后不兼容更改时,将主版本递增,并将次要版本和修补程序版本重置为 0 (,例如 2.6.5 ->3.0.0) 。

使用语义版本控制,还可以使用预发行版标签标记包。 若要使用预发行标签,请输入一个连字符,后跟你选择的任何字母 () 或数字 (s) :例如 1.0.0-beta

Azure Pipelines 支持语义版本控制,可以在 NuGet 任务中配置:

  • 对生成和包使用相同的版本控制方案

    • $(Major).$(Minor).$(rev:.r),其中 MajorMinor 管道中定义了两个变量。 此格式将自动递增内部版本号和具有新修补程序号的包版本。 它将保持主版本和次要版本不变,直到手动更改它们。
    • $(Major).$(Minor).$(Patch).$(date:yyyyMMdd),其中 MajorMinor以及 Patch 管道中定义的变量。 此格式将为生成和包创建新的预发行版标签,同时保持主版本、次要版本和修补程序版本不变。
  • 使用自定义版本控制方案。 可以为包自定义主要版本、次要版本和修补程序版本,并让 NuGet 任务基于日期和时间生成唯一的预发行版标签。

  • 使用生成管道中的脚本生成版本

此示例演示如何使用日期和时间作为预发行标签。

variables:
  Major: '1'
  Minor: '0'
  Patch: '0'

steps:
- task: NuGetCommand@2
  inputs:
    command: pack
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'

TFS 不支持 YAML。

注意

DotNetCoreDotNetStandard 包应与任务一起 DotNetCoreCLI@2 打包,以避免 System.InvalidCastExceptions。 有关更多详细信息,请参阅 .NET Core CLI 任务

task: DotNetCoreCLI@2
inputs:
    command: pack
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'

发布包

若要从管道将包发布到 Azure Artifacts 源,必须将 Project Collection Build Service 标识设置为源上的 参与者 。 有关更多详细信息 ,请参阅“配置源设置 ”。

steps:
- task: NuGetAuthenticate@0
  displayName: 'NuGet Authenticate'
- task: NuGetCommand@2
  displayName: 'NuGet push'
  inputs:
    command: push
    publishVstsFeed: '<projectName>/<feed>'
    allowPackageConflicts: true

若要将包发布到外部 NuGet 源,必须先创建服务连接以连接到该源。 可以通过转到 “项目设置>服务连接>”新建服务连接来执行此操作。 选择 NuGet,然后选择“ 下一步”。 填写表单,然后在完成后选择“ 保存 ”。 有关详细信息,请参阅 管理服务连接

若要将包发布到外部 NuGet 源,请将以下代码片段添加到 YAML 管道。

- task: NuGetAuthenticate@0
  inputs:
    nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>
- task: NuGetCommand@2
  inputs:
    command: push
    nuGetFeedType: external
    versioningScheme: byEnvVar
    versionEnvVar: <VERSION_ENVIRONMENT_VARIABLE>

使用命令行任务 (NuGet.exe) 的示例:

  - task: NuGetAuthenticate@1
    inputs:
      nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>

  - script: |
      nuget push <PACKAGE_PATH> -src https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json -ApiKey <ANY_STRING>
    displayName: "Push"          

使用命令行任务 (dotnet) 的示例:

  - task: NuGetAuthenticate@1
    inputs:
      nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>

  - script: |
      dotnet build <CSPROJ_PATH> --configuration <CONFIGURATION>
      dotnet pack <CSPROJ_PATH> -p:PackageVersion=<YOUR_PACKAGE_VERSION> --output <OUTPUT_DIRECTORY> --configuration <CONFIGURATION>
      dotnet nuget push <PACKAGE_PATH> --source https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json --api-key <ANY_STRING>
    displayName: "Build, pack and push"          

注意

ApiKey 用作占位符。

TFS 不支持 YAML。