Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
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.
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.