Dela via


Cachelagrade NuGet-paket

Azure DevOps Services

Med cachelagring av pipelinen kan du minska byggtiden genom att cachelagra dina beroenden som ska återanvändas i senare körningar. I den här artikeln får du lära dig hur du använder uppgiften Cache för att cacha och återställa dina NuGet-paket.

Kommentar

Pipeline-cachning stöds inte i klassiska release-pipelines.

Låsa beroenden

Om du vill konfigurera cacheaktiviteten måste du först låsa projektets beroenden och skapa en package.lock.json fil. Hashen för låsfilens innehåll används för att generera en unik cachenyckel.

Om du vill låsa projektets beroenden anger du egenskapen RestorePackagesWithLockFile i csproj-filen till true. NuGet-återställning genererar en låsfil packages.lock.json i rotkatalogen i projektet. Kontrollera att du kontrollerar din packages.lock.json-fil i källkoden.

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

Cachelagrade NuGet-paket

Vi måste skapa en pipelinevariabel för att peka på platsen för våra paket på agenten som kör pipelinen.

I det här exemplet hashas innehållet i packages.lock.json för att skapa en dynamisk cachenyckel. Detta säkerställer att varje gång filen ändras genereras en ny cachenyckel.

En skärmbild som visar hur cachenyckeln genereras i 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'

Kommentar

Cacheminnen är oföränderliga. När en cache har skapats kan dess innehåll inte ändras.

Återställa cacheminne

Den här aktiviteten körs bara om variabeln CACHE_RESTORED är false.

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

Kommentar

Om du använder Ubuntu 24.04 eller senare måste du använda NuGetAuthenticate-uppgiften med .NET CLI i stället för NuGetCommand@2-uppgiften. Mer information finns i Stöd för nyare Ubuntu-värdade avbildningar.

Om du får felmeddelandet "project.assets.json hittades inte" under byggaktiviteten kan du lösa det genom att ta bort villkoret condition: ne(variables.CACHE_RESTORED, true) från återställningsaktiviteten. På så sätt körs återställningskommandot, vilket genererar din project.assets.json-fil. Återställningsaktiviteten laddar inte ned paket som redan finns i motsvarande mapp.

Kommentar

En pipeline kan innehålla en eller flera cachelagringsuppgifter, och jobb och uppgifter i samma pipeline kan komma åt och dela samma cache.

Prestandajämförelse

Cachelagring av pipeline är ett bra sätt att påskynda pipelinekörningen. Här är en prestandajämförelse sida vid sida för två olika pipelines. Innan du lägger till cachelagringsaktiviteten (till höger) tog återställningsaktiviteten cirka 41 sekunder. Vi lade till cachelagringsaktiviteten i en andra pipeline (till vänster) och konfigurerade återställningsaktiviteten så att den kördes när en cachemiss påträffades. Återställningsaktiviteten i det här fallet tog 8 sekunder att slutföra.

En skärmbild som visar pipelineprestanda med och utan cachelagring.

Nedan visas den fullständiga YAML-pipelinen som referens:

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

Den här metoden är också giltig för .NET Core-projekt om projektet använder packages.lock.json för att låsa paketversioner. Du kan aktivera detta genom att ange RestorePackagesWithLockFile till True i filen * Csproj* eller med hjälp av följande kommando: dotnet restore --use-lock-file.