Freigeben über


Zwischenspeichern von NuGet-Paketen

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

Mithilfe der Pipelinezwischenspeicherung können Sie die Buildzeit reduzieren, indem Abhängigkeiten für die Wiederverwendung in künftigen Ausführungen gespeichert werden. In diesem Artikel erfahren Sie, wie Sie die Cacheaufgabe verwenden, um Ihre NuGet-Pakete zwischenzuspeichern und wiederherzustellen.

Hinweis

Die Pipelinezwischenspeicherung wird in klassischen Releasepipelines nicht unterstützt.

Voraussetzungen

Produkt Anforderungen
Azure DevOps - Ein Azure DevOps-Projekt.
- Berechtigungen:
    - Um Zugriff auf alle Pipelines im Projekt zu gewähren, müssen Sie Mitglied der Gruppe Projektadministratoren sein.

Sperren von Abhängigkeiten

Bevor Sie den Cachevorgang einrichten, müssen Sie die Abhängigkeiten Ihres Projekts sperren und eine package.lock.json Datei generieren. Der eindeutige Cacheschlüssel wird vom Hash des Inhalts dieser Sperrdatei abgeleitet, um die Konsistenz zwischen Builds sicherzustellen.

Um die Abhängigkeiten Ihres Projekts zu sperren, fügen Sie die RestorePackagesWithLockFile-eigenschaft ihrer csproj- datei hinzu, und legen Sie sie auf truefest. Wenn Sie nuget restoreausführen, wird eine packages.lock.json Datei im Stammverzeichnis Ihres Projekts generiert. Stellen Sie sicher, dass Sie die Datei packages.lock.json in Ihren Quellcode einchecken.

<PropertyGroup>
  <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>

Zwischenspeichern von NuGet-Paketen

Um NuGet-Pakete zwischenzuspeichern, definieren Sie eine Pipelinevariable, die auf den Speicherort der Pakete im Agent verweist, der die Pipeline ausführt.

Im folgenden Beispiel wird der Inhalt der packages.lock.json hashed, um einen dynamischen Cacheschlüssel zu generieren. Dadurch wird sichergestellt, dass bei jeder Änderung der Datei ein neuer Cacheschlüssel erstellt wird.

Ein Screenshot, der zeigt, wie der Cacheschlüssel in Azure-Pipelines generiert wird.

variables:
  NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages

- task: Cache@2
  displayName: Cache v2 task 
  inputs:
    key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
    restoreKeys: |
       nuget | "$(Agent.OS)"
       nuget
    path: '$(NUGET_PACKAGES)'
    cacheHitVar: 'CACHE_RESTORED'

Hinweis

Caches sind unveränderlich. Nach der Erstellung eines Cache kann der Inhalt nicht mehr geändert werden.

Wiederherstellen des Cache

Die folgende Aufgabe wird nur ausgeführt, wenn die CACHE_RESTORED Variable falseist. Dies bedeutet, dass der Wiederherstellungsschritt übersprungen wird, wenn ein Cachetreffer auftritt (die Pakete sind bereits im Cache verfügbar), um Zeit und Ressourcen zu sparen. Wenn kein Cache gefunden wird, wird der Wiederherstellungsbefehl ausgeführt, um die erforderlichen Abhängigkeiten herunterzuladen.

- task: NuGetCommand@2
  condition: ne(variables.CACHE_RESTORED, true)
  inputs:
    command: 'restore'
    restoreSolution: '**/*.sln'

Hinweis

Wenn Sie Ubuntu 24.04 oder höher verwenden, müssen Sie die NuGetAuthenticate Aufgabe mit der .NET CLI anstelle der NuGetCommand@2-Aufgabe verwenden. Weitere Informationen finden Sie unter Unterstützung für neuere gehostete Ubuntu-Images.

Fehler "project.assets.json nicht gefunden" beheben

Wenn während der Buildaufgabe der Fehler "project.assets.json nicht gefunden" auftritt, entfernen Sie die Bedingung condition: ne(variables.CACHE_RESTORED, true) aus der Wiederherstellungsaufgabe. Dadurch wird sichergestellt, dass der Wiederherstellungsbefehl ausgeführt wird und die project.assets.json Datei generiert wird. Die Wiederherstellungsaufgabe wird keine Pakete erneut herunterladen, die bereits im entsprechenden Ordner vorhanden sind.

Hinweis

Eine Pipeline kann mehrere Zwischenspeicherungsaufgaben enthalten, und Aufträge und Aufgaben innerhalb derselben Pipeline können auf denselben Cache zugreifen und diesen gemeinsam nutzen.

Leistungsvergleich

Die Zwischenspeicherung in der Pipeline reduziert die Zeit zum Wiederherstellen von Abhängigkeiten erheblich, was zu schnelleren Builds führt. Der folgende Vergleich veranschaulicht die Auswirkungen der Zwischenspeicherung auf die Pipelineausführungszeit für zwei verschiedene Pipelines:

  • Ohne Zwischenspeicherung (rechts): Die Wiederherstellungsaufgabe dauerte ungefähr 41 Sekunden.

  • Mit zwischenspeichern (links): Wir haben die Zwischenspeicherungsaufgabe zu einer zweiten Pipeline hinzugefügt und die Wiederherstellungsaufgabe so konfiguriert, dass sie nur ausgeführt wird, wenn ein Cachefehler auftritt. Die Wiederherstellungsaufgabe in diesem Fall wurde in nur 8 Sekunden abgeschlossen.

Ein Screenshot, der die Pipelineleistung mit und ohne Zwischenspeicherung anzeigt.

Nachfolgend finden Sie die vollständige YAML-Pipeline als Referenz:

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages

steps:
- task: NuGetToolInstaller@1
  displayName: 'NuGet tool installer'

- task: Cache@2
  displayName: 'NuGet Cache'
  inputs:
    key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
    restoreKeys: |
       nuget | "$(Agent.OS)"
       nuget
    path: '$(NUGET_PACKAGES)'
    cacheHitVar: 'CACHE_RESTORED'

- task: NuGetCommand@2
  displayName: 'NuGet restore'
  condition: ne(variables.CACHE_RESTORED, true)
  inputs:
    command: 'restore'
    restoreSolution: '$(solution)'

- task: VSBuild@1
  displayName: 'Visual Studio Build'
  inputs:
    solution: '$(solution)'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

Dieser Ansatz gilt auch für .NET Core-Projekte, vorausgesetzt, Ihr Projekt verwendet packages.lock.json zum Sperren von Paketversionen. Sie können diese Funktion aktivieren, indem Sie in der Datei *Csproj* RestorePackagesWithLockFile auf True festlegen, oder indem Sie den folgenden Befehl ausführen: dotnet restore --use-lock-file.