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

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

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

创建 NuGet 包

有多种方式可以创建 NuGet 包,例如使用 Visual Studio 打包 NuGet 包。 如果你已使用 MSBuild 或其他任务创建包,请跳过此部分并跳至发布 NuGet 包部分。

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

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

包版本控制

NuGet 包按名称和版本号进行区分。 建议采用语义版本控制来有效管理包版本。 语义版本由三个数字部分组成:主要版本、次要版本和修补程序版本。

修复 bug 后,补丁会递增。 发布新的向后兼容功能时,将次要版本递增,并将补丁版本重置为 0。 执行向后不兼容的更改时,将主要版本递增,并将次要版本和补丁版本重置为 0。

借助语义版本控制,还可以使用预发行标签来标记包。 为此,请输入一个连字符,后跟预发行版标记:例如 1.0.0-beta。 语义版本控制在 Azure Pipelines 中受支持,可在 NuGet 任务中按如下所示进行配置:

  • 使用日期和时间(经典):byPrereleaseNumber (YAML)。 包版本采用以下格式:Major.Minor.Patch-ci-datetime;其中,可灵活选择 Major(主要)、Minor(次要)和 Patch(补丁)的值。

  • 使用环境变量(经典):byEnvVar (YAML)。 包版本将设为你指定的环境变量的值。

  • 使用生成号(经典):byBuildNumber (YAML)。 包版本将设为内部版本号。 请确保将管道选项下的生成号格式设置为 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)。 若要在 YAML 中设置格式,请在管道的根目录处添加属性 name: 并添加格式。

以下示例演示如何使用日期和时间版本控制选项来生成符合 SemVer 并采用以下格式的版本:Major.Minor.Patch-ci-datetime

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

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

注意

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

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

发布 NuGet 包

若要从管道将包发布到 Azure Artifacts 源,管道标识必须在源上具有源发布者(参与者)角色。 有关详细信息,请参阅管道权限

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

若要将包发布到外部 NuGet 源,必须先创建服务连接以连接到该源。 若要创建服务连接:

  1. 转到项目设置>服务连接>新建服务连接
  2. 依次选择 NuGet下一步
  3. 填写表单,完成后选择保存

有关详细信息,请参阅管理服务连接

注意

NuGetAuthenticate@1 任务支持使用基本身份验证的服务连接。 该任务不支持 NuGet API 密钥身份验证。 如果服务连接使用了 ApiKey,则须使用 NuGetCommand@2 任务并在参数字段中指定 NuGet API 密钥。 有关详细信息,请参阅 NuGet 任务

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

使用命令行任务(通过 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 是必需的,但在推送到 Azure Artifacts 源时可以使用任意值。

发布到 NuGet.org

  1. 生成 API 密钥

  2. 导航到 Azure DevOps 项目,然后选择 齿轮图标项目设置。

  3. 选择“服务连接”,然后选择“新建服务连接”。

  4. 依次选择 NuGet下一步

  5. 选择 ApiKey 作为身份验证方法。 将以下 URL 用于源 URLhttps://api.nuget.org/v3/index.json

  6. 输入前面生成的 ApiKey,然后输入服务连接名称

  7. 选择授予对所有管道的访问权限,完成后选择保存。 若要选择此选项,则需要服务连接管理员角色

将以下 YAML 代码片段添加到管道定义:

steps:
- task: NuGetCommand@2
  displayName: 'NuGet push'
  inputs:
    command: push
    nuGetFeedType: external
    publishFeedCredentials: nuget.org