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 restore
genereras 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.
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.
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
.