分享方式:


使用 Azure Pipelines 發佈 NuGet 套件 (YAML/傳統)

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

透過 Azure Pipelines,您可以使用傳統或 YAML 管線,將 NuGet 套件發佈至 Azure Artifacts 摘要、外部摘要或公用登錄,例如 nuget.org。在本文中,您將瞭解如何:

  • 在 Azure Pipelines 中產生 NuGet 套件
  • 將套件發佈至內部和外部摘要
  • 將套件發佈至 NuGet.org

必要條件

建立 NuGet 套件

有數種方式可以 建立 NuGet 套件,例如使用 dotnet 或 nuget.exe CLI 來封裝您的套件。 如果您已經使用 MSBuild 或其他工作來建立套件,您可以略過本節並繼續進行下一個。

若要建立 NuGet 套件,請將下列代碼段新增至您的 YAML 檔案。 如需詳細資訊,請參閱 NuGet 工作

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack:工作用來搜尋要封裝的 csproj 目錄的模式。
  • packDestination:建立封裝的目錄。 如果空白,則會在來源根目錄建立套件。

套件版本控制

NuGet 套件是由其名稱和版本號碼所定義。 使用語意版本控制是有效管理套件版本的建議方法。 語意版本是由三個數值元件所組成:主要、次要和 Patch。

修正 Bug 之後,修補程式編號會遞增。 發行新的回溯相容功能時,您會將次要版本遞增,並將 Patch 版本重設為 0。 相反地,進行回溯不相容的變更時,您會將主要版本遞增,並將 MinorPatch 版本都重設為 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: 屬性,並定義您的格式。

以下範例示範如何使用日期和時間版本設定來產生格式化為: Major.Minor.Patch-ci-datetime 的 SemVer 兼容套件。

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)'

將套件發佈至內部摘要

注意

若要使用 Azure Pipelines 將套件發佈至摘要,請確定 專案集合組建服務和 專案的 組建服務 身分識別都會獲得 摘要發行者(參與者) 角色,這些角色會指派給您的摘要設定。 如需詳細資訊,請參閱 管理許可權

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

將套件發佈至外部摘要

若要將套件發佈至外部 NuGet 摘要或公用登錄,例如其他 Azure DevOps 組織或 nuget.org 中的摘要,您必須先建立服務連線,以向個別服務進行驗證:

  1. 從您的 Azure DevOps 項目流覽至 [項目設定>服務連線]>

  2. 選取 [新增服務連線>][NuGet>下一步]。

  3. 填寫必要的欄位,然後在完成時選取 [ 儲存 ]。 如需詳細資訊,請參閱 管理服務連線

注意

NuGetAuthenticate@1工作支援使用基本身份驗證的服務連線,但不支援 Apikey 驗證。 若要使用 ApiKey 驗證,您必須改用 NuGetCommand@2工作

若要將 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. 登入您的 nuget.org 帳戶併 產生 API 金鑰

  2. 流覽至您的 Azure DevOps 專案,然後選取 [齒輪圖示項目設定]。

  3. 選取 [服務 連線,然後選取 [新增服務連線]。

  4. 選取 [NuGet],然後選取 [ 下一步]。

  5. 選取 [ApiKey ] 作為驗證方法,並針對您的 摘要 URL 使用下列 URL: https://api.nuget.org/v3/index.json

  6. 輸入您稍早產生的 ApiKey,然後提供服務連線名稱

  7. 選取 [ 授與所有管線的訪問許可權],然後在完成時選取 [ 儲存 ]。 請注意,您需要服務連線 管理員 istrator 角色,才能選取此選項。

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