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