Sdílet prostřednictvím


Ukládání balíčků NuGet do mezipaměti

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

Ukládání do mezipaměti pipeline pomáhá zkrátit dobu sestavení uložením závislostí pro opětovné použití v budoucích spuštěních. V tomto článku se dozvíte, jak použít úlohu Cache k ukládání do mezipaměti a znovu načítání balíčků NuGet.

Poznámka:

Ukládání do mezipaměti v klasických vydávacích kanálech není podporováno.

Požadavky

produkt Požadavky
Azure DevOps – Azure DevOps projekt .
- Oprávnění:
    - Chcete-li udělit přístup ke všem kanálům v projektu, musíte být členem skupiny Project Administrators.

Uzamčení závislostí

Před nastavením úlohy mezipaměti je potřeba uzamknout závislosti projektu a vygenerovat soubor package.lock.json. Jedinečný klíč mezipaměti je odvozen od hodnoty hash obsahu tohoto souboru zámku, aby se zajistila konzistence napříč sestaveními.

Pokud chcete uzamknout závislosti projektu, přidejte vlastnost RestorePackagesWithLockFile do souboru csproj a nastavte ji na true. Když spustíte nuget restore, vygeneruje packages.lock.json soubor v kořenovém adresáři projektu. Ujistěte se, že soubor packages.lock.json zahrnete do svého zdrojového kódu.

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

Ukládání balíčků NuGet do mezipaměti

Pokud chcete ukládat balíčky NuGet do mezipaměti, definujte proměnnou kanálu, která odkazuje na umístění balíčků v agentu, na kterém kanál běží.

V následujícím příkladu se obsah packages.lock.json zatřiďuje za účelem vygenerování klíče dynamické mezipaměti. Tím se zajistí, že se při každé změně souboru vytvoří nový klíč mezipaměti.

snímek obrazovky znázorňující způsob generování klíče mezipaměti v 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'

Poznámka:

Mezipaměti jsou neměnné, jakmile je vytvořena mezipaměť, její obsah nelze změnit.

Obnovení mezipaměti

Následující úloha se spustí pouze v případě, že je proměnná CACHE_RESTOREDfalse. To znamená, že pokud dojde k zásahu do mezipaměti (balíčky už jsou v mezipaměti k dispozici), krok obnovování se přeskočí, aby se ušetřil čas a prostředky. Pokud se nenajde žádná mezipaměť, spustí se příkaz pro obnovení a stáhne potřebné závislosti.

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

Poznámka:

Pokud používáte Ubuntu 24.04 nebo novější, musíte místo úlohy NuGetAuthenticate použít NuGetCommand@2 úlohu s rozhraním příkazového řádku .NET. Další podrobnosti najdete v tématu Podpora novějších hostovaných imagí Ubuntu.

Řešení chyb "project.assets.json nenalezeno"

Pokud dojde k chybě "project.assets.json nenalezena" během úlohy sestavení, odeberte podmínku condition: ne(variables.CACHE_RESTORED, true) z úlohy obnovení. Tím se zajistí spuštění příkazu pro obnovení a vygenerování souboru project.assets.json. Úloha obnovení nepřečte balíčky, které už jsou v příslušné složce.

Poznámka:

Kanál může obsahovat několik úloh ukládání do mezipaměti a úlohy a úlohy v rámci stejného kanálu můžou přistupovat ke stejné mezipaměti a sdílet ji.

Porovnání výkonu

Ukládání do mezipaměti výrazně zkracuje dobu potřebnou k obnovení závislostí, což vede k rychlejším procesům sestavení. Následující porovnání ukazuje dopad cache na dobu spuštění pipeline pro dvě různé pipeline:

  • Bez ukládání do mezipaměti (vpravo): Úloha obnovení trvala přibližně 41 sekund.

  • S ukládáním do mezipaměti (vlevo): Přidali jsme úlohu ukládání do mezipaměti do druhého kanálu a nakonfigurovali úlohu obnovení tak, aby běžela pouze v případě, že dojde k chybě mezipaměti. Úloha obnovení v tomto případě byla dokončena za pouhých 8 sekund.

snímek obrazovky zobrazující výkon pipeline s ukládáním do mezipaměti a bez něj.

Níže najdete úplný kanál YAML pro referenci:

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

Tento přístup platí také pro projekty .NET Core za předpokladu, že váš projekt používá packages.lock.json k uzamčení verzí balíčků. Můžete to povolit nastavením RestorePackagesWithLockFile na True v souboru * Csproj* nebo spuštěním následujícího příkazu: dotnet restore --use-lock-file.