Freigeben über


Veröffentlichen von NuGet-Paketen mit Azure Pipelines (YAML/Klassisch)

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

Mit Azure Pipelines können Sie entweder klassische oder YAML-Pipelines verwenden, um Ihre NuGet-Pakete in Ihrem Azure Artifacts-Feed, in externen Feeds oder in öffentlichen Registern wie nuget.org zu veröffentlichen. In diesem Artikel erfahren Sie Folgendes:

  • Generieren eines NuGet-Pakets in Azure Pipelines
  • Veröffentlichen von Paketen in internen und externen Feeds
  • Veröffentlichen von Paketen in NuGet.org

Voraussetzungen

Erstellen eines NuGet-Pakets

Es gibt verschiedene Möglichkeiten, Ihre NuGet-Pakete zu erstellen, z. B. die Verwendung des dotnet oder nuget.exe CLI zum Packen Ihrer Pakete. Wenn Sie zum Erstellen Ihrer Pakete bereits MSBuild oder andere Aufgaben verwenden, können Sie diesen Abschnitt überspringen und mit dem nächsten fortfahren.

Um ein NuGet-Paket zu erstellen, fügen Sie den folgenden Ausschnitt zu Ihrer Pipeline-YAML-Datei hinzu. Weitere Informationen finden Sie unter NuGet-Aufgabe.

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: Das Muster, das die Aufgabe verwendet, um nach zu packenden CSPROJ-Verzeichnissen zu suchen.
  • packDestination: Verzeichnis, in dem die Pakete erstellt werden. Wenn kein Ordner angegeben ist, werden Pakete im Quellenstamm erstellt.

Paketversionsverwaltung

NuGet-Pakete werden durch ihre Namen und Versionsnummern definiert. Für die effektive Verwaltung von Paketversionen empfiehlt sich die Verwendung der semantischen Versionierung. Semantische Versionen bestehen aus drei numerischen Komponenten: Hauptversion, Nebenversion und Patchversion.

Die Patch-Nummer wird nach dem Beheben eines Bugs inkrementiert. Wenn eine neue abwärtskompatible Funktion veröffentlicht wird, erhöhen Sie die Neben-Version und setzen die Patch-Version auf 0 zurück. Wenn Sie hingegen eine nicht abwärtskompatible Änderung vornehmen, erhöhen Sie die Haupt-Version und setzen sowohl die Neben- und Patch-Versionen auf 0 zurück.

Die semantische Versionierung unterstützt auch die Verwendung von Vorabversionsetiketten zum Kennzeichnen von Paketen. Fügen Sie einfach einen Bindestrich gefolgt von Ihrem Prärelease-Tag an, z. B. 1.0.0-beta.

Azure Pipelines unterstützt die semantische Versionsverwaltung und bietet die folgenden Konfigurationsoptionen für NuGet-Aufgaben:

  • Verwenden Sie Datum und Uhrzeit (Classic) | byPrereleaseNumber (YAML): Ihre Paketversion folgt dem Format: Major.Minor.Patch-ci-datetime , wobei Sie die Haupt-, Neben- und Patch-Werte flexibel anpassen können.

  • Verwenden einer Umgebungsvariable (klassisch) | byEnvVar (YAML): Ihre Paketversion wird auf den Wert der angegebenen Umgebungsvariablen festgelegt.

  • Verwenden der Buildnummer (Classic) | byBuildNumber (YAML): Ihre Paketversion wird auf die Buildnummer festgelegt. Stellen Sie sicher, dass Sie das Buildnummernformat in Ihrer Pipeline Pipelineoptionen als $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)definieren. Um das Format in YAML anzugeben, fügen Sie an der Stammadresse Ihrer Pipeline eine Eigenschaft name: hinzu und definieren Sie Ihr Format.

Unten sehen Sie ein Beispiel, das zeigt, wie Sie mithilfe der Datums- und Uhrzeitversionierung ein SemVer-kompatibles Paket im Format Major.Minor.Patch-ci-datetime generieren.

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

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

Hinweis

DotNetCore- und DotNetStandard-Pakete sollten mit der DotNetCoreCLI@2-Aufgabe verpackt werden, um System.InvalidCastExceptions zu vermeiden. Weitere Informationen finden Sie in der .NET Core-CLI-Aufgabe.

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

Veröffentlichen von Paketen in internen Feeds

Hinweis

Um Ihre Pakete mithilfe von Azure Pipelines in einem Feed zu veröffentlichen, stellen Sie sicher, dass sowohl dem Project Collection Build Service als auch dem Build Service Ihres Projekts die in Ihren Feed-Einstellungen zugewiesene Rolle Feed Publisher (Contributor) zugewiesen ist. Weitere Details finden Sie unter Verwalten von Berechtigungen.

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

Veröffentlichen von Paketen in externen Feeds

Um Ihre Pakete in externen NuGet-Feeds oder öffentlichen Registern zu veröffentlichen, z. B. Feeds in anderen Azure DevOps-Organisationen oder nuget.org, müssen Sie zuerst eine Dienstverbindung erstellen, um sich beim jeweiligen Dienst zu authentifizieren:

  1. Navigieren Sie in Ihrem Azure DevOps-Projekt zu Projekteinstellungen>Dienstverbindungen>.

  2. Wählen Sie Neue Dienstverbindung>NuGet>Next aus.

  3. Füllen Sie die erforderlichen Felder aus, und klicken Sie auf Speichern, wenn Sie fertig sind. Weitere Informationen finden Sie unter Verwalten von Dienstverbindungen.

Hinweis

Die NuGetAuthenticate@1 Aufgabe unterstützt Dienstverbindungen mit grundlegender Authentifizierung, jedoch keine APIKEY-Authentifizierung. Um die ApiKey-Authentifizierung zu verwenden, müssen Sie stattdessen die NuGetCommand@2 Aufgabe verwenden.

Um Ihre NuGet-Pakete in einem Feed in einer anderen Organisation zu veröffentlichen, fügen Sie der YAML-Pipeline den folgenden Ausschnitt hinzu:

  • Verwenden der Befehlszeilenaufgabe und 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"          
    
  • Verwenden der Befehlszeilenaufgabe und 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"          
      ```
    
    

Hinweis

Der ApiKey ist erforderlich, aber Sie können beim Veröffentlichen in einem Azure Artifacts-Feed eine beliebige Zeichenfolge verwenden.

Veröffentlichen auf NuGet.org

  1. Melden Sie sich bei Ihrem nuget.org-Konto an, und generieren Sie einen API-Schlüssel.

  2. Navigieren Sie zu Ihrem Azure DevOps-Projekt, und wählen Sie dann ZahnradsymbolProjekteinstellungen aus.

  3. Wählen Sie Dienstverbindungen und dann Neue Dienstverbindung aus.

  4. Wählen Sie NuGet und anschließend Weiter aus.

  5. Wählen Sie ApiKey als Authentifizierungsmethode und verwenden Sie die folgende URL für Ihre Feed URL: https://api.nuget.org/v3/index.json.

  6. Geben Sie den ApiKey ein, den Sie zuvor generiert haben, und stellen Sie dann einen Dienstverbindungsnamen bereit.

  7. Wählen Sie Allen Pipelines die Zugriffsberechtigung gewähren und dann Speichern aus, wenn Sie fertig sind. Beachten Sie, dass Sie zum Auswählen dieser Option über die Rolle des Serviceverbindungsadministrators verfügen müssen.

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