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 cacheuppgiften för att cachelagras och återställa Dina NuGet-paket.
Kommentar
Cachelagring av pipeline stöds i agentpooljobb för både YAML- och klassiska pipelines. Det stöds dock inte i klassiska versionspipelines.
Låsa beroenden
För att konfigurera cacheaktiviteten måste vi först låsa projektets beroenden och skapa en package.lock.json fil. Vi använder hashen för innehållet i den här filen för att generera en unik nyckel för cacheminnet.
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'
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)'