Condividi tramite


Memorizzare nella cache i pacchetti NuGet

Azure DevOps Services

Con la memorizzazione nella cache della pipeline, è possibile ridurre il tempo di compilazione memorizzando nella cache le dipendenze da riutilizzare nelle esecuzioni successive. In questo articolo si apprenderà come usare l'attività Cache per memorizzare nella cache e ripristinare i pacchetti NuGet.

Bloccare le dipendenze

Per configurare l'attività cache, è necessario prima bloccare le dipendenze del progetto e creare un file package.lock.json . Verrà usato 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 di 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.

Screenshot che mostra come viene generata la chiave della cache in Azure Pipelines.

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, dopo la creazione di 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, verrà eseguito il comando di ripristino, 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 delle pipeline è un ottimo modo per velocizzare l'esecuzione della pipeline. Ecco un confronto delle prestazioni affiancato 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 nella cache. Il completamento dell'attività di ripristino in questo caso ha richiesto 8 secondi.

Screenshot che mostra le prestazioni della pipeline con e senza memorizzazione nella cache.

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)'