Sdílet prostřednictvím


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

Služby Azure DevOps

Ukládáním kanálů do mezipaměti můžete zkrátit dobu sestavení tím, že závislosti uložíte do mezipaměti, aby se v pozdějších spuštěních znovu používaly. V tomto článku se dozvíte, jak pomocí úlohy Mezipaměti ukládat do mezipaměti a obnovovat balíčky NuGet.

Poznámka:

Ukládání kanálů do mezipaměti je podporováno v úlohách fondu agentů pro kanály YAML i klasické kanály. Nepodporuje se ale v kanálech verze Classic.

Uzamčení závislostí

Abychom mohli nastavit úlohu mezipaměti, musíme nejprve uzamknout závislosti projektu a vytvořit soubor package.lock.json . K vygenerování jedinečného klíče pro mezipaměť použijeme hodnotu hash obsahu tohoto souboru.

Pokud chcete uzamknout závislosti projektu, nastavte vlastnost RestorePackagesWithLockFile v souboru csproj na hodnotu true. Obnovení NuGet vygeneruje soubor zámku packages.lock.json v kořenovém adresáři projektu. Ujistěte se, že zkontrolujete soubor packages.lock.json do zdrojového kódu.

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

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

Budeme muset vytvořit proměnnou kanálu, která bude odkazovat na umístění našich balíčků v agentovi, na kterém kanál běží.

V tomto příkladu bude obsah packages.lock.json hashován, aby se vytvořil klíč dynamické mezipaměti. Tím se zajistí, že se při každé změně souboru vygeneruje nový klíč mezipaměti.

Snímek obrazovky znázorňující, jak se klíč mezipaměti generuje ve službě 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'

Poznámka:

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

Obnovení mezipaměti

Tato úloha se spustí pouze v případě, že CACHE_RESTORED je proměnná false.

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

Pokud se během úlohy sestavení zobrazí chybová zpráva "project.assets.json nenalezena", můžete ji vyřešit odebráním podmínky condition: ne(variables.CACHE_RESTORED, true) z úlohy obnovení. Tím se příkaz restore spustí a vygeneruje project.assets.json soubor. Úloha obnovení nestahuje balíčky, které již existují ve vaší odpovídající složce.

Poznámka:

Kanál může obsahovat jednu nebo více ú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 je.

Porovnání výkonu

Ukládání kanálů do mezipaměti je skvělý způsob, jak urychlit provádění kanálu. Tady je souběžné porovnání výkonu pro dva různé kanály. Před přidáním úlohy ukládání do mezipaměti (vpravo) trvalo obnovení přibližně 41 sekund. Přidali jsme úlohu ukládání do mezipaměti do druhého kanálu (vlevo) a nakonfigurovali úlohu obnovení tak, aby se spustila, když dojde k chybě mezipaměti. Dokončení úlohy obnovení v tomto případě trvalo 8 sekund.

Snímek obrazovky znázorňující výkon kanálu s ukládáním do mezipaměti a bez ukládání do mezipaměti

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