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