Delen via


NuGet-pakketten in cache opslaan

Azure DevOps Services

Met pijplijncaching kunt u de buildtijd verminderen door de afhankelijkheden in de cache op te slaan die in latere uitvoeringen opnieuw moeten worden gebruikt. In dit artikel leert u hoe u de cachetaak gebruikt om uw NuGet-pakketten in de cache op te slaan en te herstellen.

Notitie

Pijplijncache wordt ondersteund in agentpooltaken voor zowel YAML- als klassieke pijplijnen. Het wordt echter niet ondersteund in klassieke release-pijplijnen.

Afhankelijkheden vergrendelen

Als u de cachetaak wilt instellen, moeten we eerst de afhankelijkheden van het project vergrendelen en een package.lock.json-bestand maken. We gebruiken de hash van de inhoud van dit bestand om een unieke sleutel voor onze cache te genereren.

Als u de afhankelijkheden van uw project wilt vergrendelen, stelt u de eigenschap RestorePackagesWithLockFile in uw csproj-bestand in op true. NuGet-herstel genereert een vergrendelingsbestand packages.lock.json in de hoofdmap van uw project. Controleer uw packages.lock.json bestand in de broncode.

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

NuGet-pakketten in cache opslaan

We moeten een pijplijnvariabele maken om te verwijzen naar de locatie van onze pakketten op de agent waarop de pijplijn wordt uitgevoerd.

In dit voorbeeld wordt de inhoud van de packages.lock.json gehasht om een dynamische cachesleutel te produceren. Dit zorgt ervoor dat telkens wanneer het bestand wordt gewijzigd, een nieuwe cachesleutel wordt gegenereerd.

Een schermopname die laat zien hoe de cachesleutel wordt gegenereerd in 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'

Notitie

Caches zijn onveranderbaar, zodra een cache is gemaakt, kan de inhoud ervan niet worden gewijzigd.

Cache herstellen

Deze taak wordt alleen uitgevoerd als de CACHE_RESTORED variabele onwaar is.

- task: NuGetCommand@2
  condition: ne(variables.CACHE_RESTORED, true)
  inputs:
    command: 'restore'
    restoreSolution: '**/*.sln'

Als u het foutbericht 'project.assets.json niet gevonden' ziet tijdens de buildtaak, kunt u dit oplossen door de voorwaarde condition: ne(variables.CACHE_RESTORED, true) uit de hersteltaak te verwijderen. Als u dit doet, wordt de herstelopdracht uitgevoerd en wordt uw project.assets.json-bestand gegenereerd. Met de hersteltaak worden geen pakketten gedownload die al aanwezig zijn in uw bijbehorende map.

Notitie

Een pijplijn kan een of meer cachetaken bevatten en taken en taken in dezelfde pijplijn hebben toegang tot dezelfde cache en delen.

Prestatievergelijking

Pijplijncaching is een uitstekende manier om de uitvoering van uw pijplijn te versnellen. Hier volgt een vergelijking van de prestaties naast elkaar voor twee verschillende pijplijnen. Voordat u de cachetaak (rechts) toevoegt, duurde de hersteltaak ongeveer 41 seconden. We hebben de cachetaak toegevoegd aan een tweede pijplijn (links) en de hersteltaak geconfigureerd die moet worden uitgevoerd wanneer er een cachemisser wordt aangetroffen. Het duurt 8 seconden voordat de hersteltaak is voltooid.

Een schermopname van de pijplijnprestaties met en zonder caching.

Hieronder vindt u de volledige YAML-pijplijn ter referentie:

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