Aracılığıyla paylaş


NuGet paketlerini önbelleğe alma

Azure DevOps Services

İşlem hattı önbelleğe alma ile bağımlılıklarınızı daha sonraki çalıştırmalarda yeniden kullanmak üzere önbelleğe alarak derleme sürenizi kısaltabilirsiniz. Bu makalede, NuGet paketlerinizi önbelleğe almak ve geri yüklemek için Önbellek görevini kullanmayı öğreneceksiniz.

Not

İşlem hattı önbelleğe alma, hem YAML hem de Klasik işlem hatları için aracı havuzu işlerinde desteklenir. Ancak, Klasik yayın işlem hatlarında desteklenmez.

Bağımlılıkları kilitleme

Önbellek görevini ayarlamak için önce projemizin bağımlılıklarını kilitlemeli ve bir package.lock.json dosyası oluşturmalıyız. Önbelleğimiz için benzersiz bir anahtar oluşturmak için bu dosyanın içeriğinin karması kullanılır.

Projenizin bağımlılıklarını kilitlemek için csproj dosyanızdaki RestorePackagesWithLockFile özelliğini true olarak ayarlayın. NuGet geri yükleme, projenizin kök dizininde packages.lock.json bir kilit dosyası oluşturur. packages.lock.json dosyanızı kaynak kodunuzla denetlediğinizden emin olun.

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

NuGet paketlerini önbelleğe alma

İşlem hattını çalıştıran aracıda paketlerimizin konumunu işaret eden bir işlem hattı değişkeni oluşturmamız gerekir.

Bu örnekte, packages.lock.json içeriği dinamik bir önbellek anahtarı oluşturmak için karma olarak kullanılacaktır. Bu, dosya her değiştirildiğinde yeni bir önbellek anahtarı oluşturulmasını sağlar.

Azure Pipelines'da önbellek anahtarının nasıl oluşturulduğunu gösteren ekran görüntüsü.

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'

Not

Önbellekler sabittir, önbellek oluşturulduktan sonra içeriği değiştirilemez.

Önbelleği geri yükleme

Bu görev yalnızca değişken false olduğunda CACHE_RESTORED çalışır.

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

Derleme göreviniz sırasında "project.assets.json bulunamadı" hata iletisiyle karşılaşırsanız, geri yükleme görevinizden koşulu condition: ne(variables.CACHE_RESTORED, true) kaldırarak sorunu çözebilirsiniz. Bunu yaptığınızda geri yükleme komutu yürütülür ve project.assets.json dosyanız oluşturulur. Geri yükleme görevi, ilgili klasörünüzde zaten var olan paketleri indirmez.

Not

İşlem hattı bir veya daha fazla önbelleğe alma görevi içerebilir ve aynı işlem hattındaki işler ve görevler aynı önbelleğe erişip paylaşabilir.

Performans karşılaştırması

İşlem hattı önbelleğe alma, işlem hattı yürütmenizi hızlandırmanın harika bir yoludur. İki farklı işlem hattı için yan yana performans karşılaştırması aşağıdadır. Önbelleğe alma görevini eklemeden önce (sağ), geri yükleme görevi yaklaşık 41 saniye sürdü. Önbelleğe alma görevini ikinci bir işlem hattına (solda) ekledik ve önbellek hatasıyla karşılaşıldığında geri yükleme görevini çalışacak şekilde yapılandırdık. Bu durumda geri yükleme görevinin tamamlanması 8 saniye sürdü.

önbelleğe alma ile ve önbelleğe alınmadan işlem hattı performansını gösteren ekran görüntüsü.

Başvuru için tam YAML işlem hattı aşağıdadır:

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