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

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'

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