Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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.
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.