Zwischenspeichern von NuGet-Paketen
Azure DevOps Services
Mit der Pipelinezwischenspeicherung können Sie die Buildzeit reduzieren, indem Sie Ihre Abhängigkeiten zwischenspeichern, die in späteren Ausführungen wiederverwendet werden sollen. 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.
Sperren von Abhängigkeiten
Um den Cachevorgang einzurichten, müssen Sie zuerst die Abhängigkeiten Ihres Projekts sperren und eine package.lock.json Datei erstellen. Der Hash des Inhalts der Sperrdatei wird verwendet, um einen eindeutigen Cacheschlüssel zu generieren.
Um die Abhängigkeiten Ihres Projekts zu sperren, legen Sie die Eigenschaft RestorePackagesWithLockFile in Ihrer csproj-Datei auf true fest. Bei der NuGet-Wiederherstellung wird die Sperrdatei packages.lock.json im Stammverzeichnis des Projekts generiert. Überprüfen Sie die Datei packages.lock.json in Ihrem Quellcode.
<PropertyGroup>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
Zwischenspeichern von NuGet-Paketen
Wir müssen eine Pipelinevariable erstellen, die auf den Speicherort unserer Pakete auf dem Agent verweist, der die Pipeline ausführt.
In diesem Beispiel wird der Inhalt der packages.lock.json hashed, um einen dynamischen Cacheschlüssel zu erzeugen. Dadurch wird sichergestellt, dass jedes Mal, wenn die Datei geändert wird, ein neuer Cacheschlüssel generiert wird.
variables:
NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
- task: Cache@2
displayName: Cache
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
Diese Aufgabe wird nur ausgeführt, wenn die CACHE_RESTORED
-Variable „false“ ist.
- 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.
Wenn während der Buildaufgabe die Fehlermeldung „'project.assets.json' nicht gefunden“ angezeigt wird, können Sie sie beheben, indem Sie die Bedingung condition: ne(variables.CACHE_RESTORED, true)
aus der Wiederherstellungsaufgabe entfernen. Dadurch wird der Wiederherstellungsbefehl ausgeführt und die Datei „project.assets.json“ generiert. Die Wiederherstellungsaufgabe lädt keine Pakete herunter, die bereits in Ihrem entsprechenden Ordner vorhanden sind.
Hinweis
Eine Pipeline kann eine oder mehrere Zwischenspeicherungsaufgaben enthalten, und Aufträge und Aufgaben innerhalb derselben Pipeline können auf denselben Cache zugreifen und diesen gemeinsam nutzen.
Leistungsvergleich
Die Pipelinezwischenspeicherung ist eine hervorragende Möglichkeit, die Pipelineausführung zu beschleunigen. Im Folgenden finden Sie einen direkten Leistungsvergleich für zwei verschiedene Pipelines. Vor dem Hinzufügen der Zwischenspeicherungsaufgabe (rechts) dauerte der Wiederherstellungsvorgang ungefähr 41 Sekunden. Wir haben die Zwischenspeicherungsaufgabe zu einer zweiten Pipeline (links) hinzugefügt und die Wiederherstellungsaufgabe so konfiguriert, dass sie ausgeführt wird, wenn ein Cachefehler auftritt. Der Wiederherstellungsvorgang dauerte in diesem Fall 8 Sekunden.
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, wenn Ihr Projekt packages.lock.json zum Sperren von Paketversionen verwendet. Sie können dies aktivieren, indem Sie in Ihrer *Csproj*-Datei RestorePackagesWithLockFile
auf True
festlegen oder den folgenden Befehl verwenden: dotnet restore --use-lock-file
.