Delen via


NuGet-pakketten in cache opslaan

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Pijplijncaching helpt de buildtijd te verkorten door afhankelijkheden op te slaan voor hergebruik in toekomstige uitvoeringen. In dit artikel leert u hoe u de Cache-taak gebruikt om uw NuGet-pakketten in de cache op te slaan en te herstellen.

Notitie

Pijplijncache wordt niet ondersteund in klassieke release-pijplijnen.

Benodigdheden

Product vereisten
Azure DevOps - Een Azure DevOps-project.
- Toestemmingen:
    - Als u toegang wilt verlenen tot alle pijplijnen in het project, moet u lid zijn van de groep Projectbeheerders.

Afhankelijkheden vergrendelen

Voordat u de cachetaak instelt, moet u de afhankelijkheden van uw project vergrendelen en een package.lock.json-bestand genereren. De unieke cachesleutel wordt afgeleid van de hash van de inhoud van dit vergrendelingsbestand om consistentie in builds te garanderen.

Als u de afhankelijkheden van uw project wilt vergrendelen, voegt u de eigenschap RestorePackagesWithLockFile toe aan uw csproj-bestand en stelt u deze in op true. Wanneer u nuget restoreuitvoert, wordt er een packages.lock.json-bestand gegenereerd in de hoofdmap van uw project. Zorg ervoor dat u uw packages.lock.json bestand incheckt in uw broncode.

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

NuGet-pakketten in cache opslaan

Als u NuGet-pakketten in de cache wilt opslaan, definieert u een pijplijnvariabele die verwijst naar de locatie van de pakketten op de agent waarop de pijplijn wordt uitgevoerd.

In het onderstaande voorbeeld wordt de inhoud van de packages.lock.json gehasht om een dynamische cachesleutel te genereren. Dit zorgt ervoor dat wanneer het bestand wordt gewijzigd, er een nieuwe cachesleutel wordt gemaakt.

Een schermopname waarin wordt weergegeven hoe de cachesleutel wordt gegenereerd in Azure Pipelines.

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'

Notitie

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

Cache herstellen

De volgende taak wordt alleen uitgevoerd als de variabele CACHE_RESTOREDonwaar is. Dit betekent dat als er een cachetreffer optreedt (de pakketten al beschikbaar zijn in de cache), de herstelstap wordt overgeslagen om tijd en resources te besparen. Als er geen cache wordt gevonden, wordt de herstelopdracht uitgevoerd om de benodigde afhankelijkheden te downloaden.

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

Notitie

Als u Ubuntu 24.04 of hoger gebruikt, moet u de NuGetAuthenticate taak gebruiken met de .NET CLI in plaats van de NuGetCommand@2 taak. Zie Ondersteuning voor nieuwere gehoste Ubuntu-installatiekopieën voor meer informatie.

Fouten 'project.assets.json niet gevonden' afhandelen

Als de fout 'project.assets.json niet gevonden' tijdens de buildtaak optreedt, verwijdert u de voorwaarde condition: ne(variables.CACHE_RESTORED, true) uit de hersteltaak. Dit zorgt ervoor dat de herstelopdracht wordt uitgevoerd en het project.assets.json-bestand wordt gegenereerd. Met de hersteltaak worden pakketten die al aanwezig zijn in de bijbehorende map niet opnieuw gedownload.

Notitie

Een pijplijn kan meerdere cachetaken bevatten, en jobs en taken binnen dezelfde pijplijn kunnen toegang krijgen tot en gebruikmaken van dezelfde cache.

Prestatievergelijking

Het opslaan van pijplijnen in cache vermindert de tijd die nodig is om afhankelijkheden te herstellen, wat leidt tot snellere builds. In de volgende vergelijking wordt de impact van caching op de uitvoeringstijd van twee verschillende pijplijnen geïllustreerd.

  • Zonder caching (rechts): de hersteltaak duurde ongeveer 41 seconden.

  • Met cache (links): we hebben de cachetaak toegevoegd aan een tweede pijplijn en de hersteltaak zo geconfigureerd dat deze alleen wordt uitgevoerd wanneer er een cache ontbreekt. De hersteltaak in dit geval is in slechts 8 seconden voltooid.

een schermopname met de prestaties van de pijplijn 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)'

Deze benadering is ook van toepassing op .NET Core-projecten, mits uw project gebruikmaakt van packages.lock.json om pakketversies te vergrendelen. U kunt dit inschakelen door RestorePackagesWithLockFile in te stellen op True in het bestand * Csproj* of door de volgende opdracht uit te voeren: dotnet restore --use-lock-file.