Dela via


Cacha NuGet-paket

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Pipelincachelagring hjälper till att minska byggtiden genom att lagra beroenden för återanvändning vid framtida 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.

Anteckning

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

Förutsättningar

Produkt Krav
Azure DevOps – Ett Azure DevOps-projekt.
- behörigheter:
    – Om du vill bevilja åtkomst till alla pipelines i projektet måste du vara medlem i gruppen projektadministratörer.

Låsa beroenden

Innan du konfigurerar cacheaktiviteten måste du låsa projektets beroenden och generera en package.lock.json fil. Den unika cachenyckeln härleds från hashen för innehållet i den här låsfilen för att säkerställa konsekvens mellan versioner.

Om du vill låsa projektets beroenden lägger du till egenskapen RestorePackagesWithLockFile i filen csproj och ställer in den på true. När du kör nuget restoregenereras en packages.lock.json fil i projektets rotkatalog. Kontrollera att du kontrollerar din packages.lock.json-fil i källkoden.

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

Cachelagrade NuGet-paket

Om du vill cachelagla NuGet-paket definierar du en pipelinevariabel som pekar på platsen för paketen på agenten som kör pipelinen.

I exemplet nedan hashas innehållet i packages.lock.json för att generera en dynamisk cachenyckel. Detta säkerställer att när filen ändras skapas 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 v2 task 
  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

Följande aktivitet körs bara om variabeln CACHE_RESTORED är false. Det innebär att om en cacheträff sker (paketen är redan tillgängliga i cacheminnet) skippas återställningssteget för att spara tid och resurser. Om ingen cache hittas körs återställningskommandot för att ladda ned nödvändiga beroenden.

- 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 den NuGetAuthenticate-uppgiften med .NET CLI istället för den NuGetCommand@2-uppgiften. Mer information finns i Stöd för nyare Ubuntu-värdade avbildningar.

Hantera "project.assets.json hittades inte"-felmeddelanden

Om du stöter på felet "project.assets.json hittades inte" under bygguppgiften, tar du bort villkoret condition: ne(variables.CACHE_RESTORED, true) från återställningsuppgiften. Detta säkerställer att återställningskommandot körs och genererar filen project.assets.json. Återställningsaktiviteten laddar inte ned paket som redan finns i motsvarande mapp igen.

Kommentar

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

Prestandajämförelse

Cachelagring av pipeline minskar avsevärt den tid som krävs för att återställa beroenden, vilket leder till snabbare versioner. Följande jämförelse visar hur cachelagring påverkar pipelinekörningstiden för två olika pipelines:

  • Utan cachelagring (höger): Återställningsaktiviteten tog cirka 41 sekunder.

  • Med cachelagring (vänster): Vi lade till cachelagringsaktiviteten i en andra pipeline och konfigurerade återställningsaktiviteten så att den bara kördes när en cachemiss inträffar. Återställningsaktiviteten i det här fallet slutfördes på bara 8 sekunder.

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 gäller även för .NET Core-projekt, förutsatt att 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 genom att köra följande kommando: dotnet restore --use-lock-file.