Sdílet prostřednictvím


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

Azure DevOps Services

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

Uzamknout závislosti

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

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. Nezapomeňte zkontrolovat soubor packages.lock.json ve zdrojovém 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, který kanál spouští.

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

Snímek obrazovky znázorňující generování klíče mezipaměti v 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 mezipaměť vytvořena, její obsah nelze změnit.

Obnovení mezipaměti

Tato úloha se spustí pouze v případě, že CACHE_RESTORED proměnná má hodnotu 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 "projekt.assets.json se nenašel", můžete to vyřešit odebráním podmínky condition: ne(variables.CACHE_RESTORED, true) z úlohy obnovení. Tím se spustí příkaz restore, který vygeneruje soubor project.assets.json. Úloha obnovení nestáhne balíčky, které už jsou v příslušné složce.

Poznámka

Kanál může obsahovat jednu nebo více úloh ukládání do mezipaměti a úlohy a úkoly 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 kanálu 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 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)'