Memorizzare nella cache i pacchetti NuGet
Servizi di Azure DevOps
Con la memorizzazione nella cache della pipeline, è possibile ridurre il tempo di compilazione memorizzando nella cache le dipendenze da riutilizzare nelle esecuzioni successive. Questo articolo illustra come usare l'attività Cache per memorizzare nella cache e ripristinare i pacchetti NuGet.
Nota
La memorizzazione nella cache della pipeline è supportata nei processi del pool di agenti sia per le pipeline YAML che per le pipeline classiche. Tuttavia, non è supportato nelle pipeline di versione classica.
Bloccare le dipendenze
Per configurare l'attività della cache, è necessario prima bloccare le dipendenze del progetto e creare un file package.lock.json . Si userà l'hash del contenuto di questo file per generare una chiave univoca per la cache.
Per bloccare le dipendenze del progetto, impostare la proprietà RestorePackagesWithLockFile nel file csproj su true. Il ripristino NuGet genera un file di blocco packages.lock.json nella directory radice del progetto. Assicurarsi di controllare il file packages.lock.json nel codice sorgente.
<PropertyGroup>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
Memorizzare nella cache i pacchetti NuGet
Sarà necessario creare una variabile della pipeline in modo che punti alla posizione dei pacchetti nell'agente che esegue la pipeline.
In questo esempio, il contenuto del packages.lock.json verrà sottoposto a hashing per produrre una chiave della cache dinamica. In questo modo si garantisce che ogni volta che il file viene modificato, viene generata una nuova chiave della cache.
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'
Nota
Le cache non sono modificabili, una volta creata una cache, il relativo contenuto non può essere modificato.
Ripristinare la cache
Questa attività verrà eseguita solo se la CACHE_RESTORED
variabile è false.
- task: NuGetCommand@2
condition: ne(variables.CACHE_RESTORED, true)
inputs:
command: 'restore'
restoreSolution: '**/*.sln'
Se si verifica il messaggio di errore "project.assets.json non trovato" durante l'attività di compilazione, è possibile risolverlo rimuovendo la condizione condition: ne(variables.CACHE_RESTORED, true)
dall'attività di ripristino. In questo modo, il comando di ripristino verrà eseguito, generando il file project.assets.json. L'attività di ripristino non scaricherà i pacchetti già presenti nella cartella corrispondente.
Nota
Una pipeline può contenere una o più attività di memorizzazione nella cache e processi e attività all'interno della stessa pipeline possono accedere e condividere la stessa cache.
Confronto delle prestazioni
La memorizzazione nella cache della pipeline è un ottimo modo per velocizzare l'esecuzione della pipeline. Ecco un confronto delle prestazioni side-by-side per due pipeline diverse. Prima di aggiungere l'attività di memorizzazione nella cache (a destra), l'attività di ripristino ha richiesto circa 41 secondi. È stata aggiunta l'attività di memorizzazione nella cache a una seconda pipeline (a sinistra) e è stata configurata l'attività di ripristino da eseguire quando viene rilevato un mancato riscontro della cache. Il completamento dell'attività di ripristino in questo caso ha richiesto 8 secondi.
Di seguito è riportata la pipeline YAML completa per riferimento:
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)'