Bagikan melalui


Paket Cache NuGet

Azure DevOps

Dengan penembolokan alur, Anda dapat mengurangi waktu build dengan membuat cache dependensi untuk digunakan kembali dalam eksekusi nanti. Dalam artikel ini, Anda akan mempelajari cara menggunakan tugas Cache untuk menyimpan cache dan memulihkan paket NuGet Anda.

Catatan

Penembolokan alur didukung dalam pekerjaan kumpulan agen untuk alur YAML dan Klasik. Namun, ini tidak didukung dalam alur rilis Klasik.

Kunci dependensi

Untuk menyiapkan tugas cache, kita harus terlebih dahulu mengunci dependensi proyek kita dan membuat file package.lock.json . Kita akan menggunakan hash konten file ini untuk menghasilkan kunci unik untuk cache kita.

Untuk mengunci dependensi proyek Anda, atur properti RestorePackagesWithLockFile di file csproj Anda ke true. Pemulihan NuGet menghasilkan file kunci packages.lock.json di direktori akar proyek Anda. Pastikan Anda memeriksa file packages.lock.json ke dalam kode sumber Anda.

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

Paket Cache NuGet

Kita harus membuat variabel alur untuk menunjuk ke lokasi paket kita pada agen yang menjalankan alur.

Dalam contoh ini, konten packages.lock.json akan di-hash untuk menghasilkan kunci cache dinamis. Ini memastikan bahwa setiap kali file dimodifikasi, kunci cache baru dihasilkan.

Cuplikan layar memperlihatkan bagaimana kunci cache dihasilkan di 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'

Catatan

Cache tidak dapat diubah, setelah cache dibuat, kontennya tidak dapat dimodifikasi.

Memulihkan cache

Tugas ini hanya akan berjalan jika CACHE_RESTORED variabel salah.

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

Jika Anda menemukan pesan kesalahan "project.assets.json tidak ditemukan" selama tugas build, Anda dapat mengatasinya dengan menghapus kondisi condition: ne(variables.CACHE_RESTORED, true) dari tugas pemulihan Anda. Dengan demikian, perintah pemulihan akan dijalankan, menghasilkan file project.assets.json Anda. Tugas pemulihan tidak akan mengunduh paket yang sudah ada di folder yang sesuai.

Catatan

Alur dapat berisi satu atau beberapa tugas penembolokan, dan pekerjaan dan tugas dalam alur yang sama dapat mengakses dan berbagi cache yang sama.

Perbandingan performa

Penembolokan alur adalah cara yang bagus untuk mempercepat eksekusi alur Anda. Berikut adalah perbandingan performa berdampingan untuk dua alur yang berbeda. Sebelum menambahkan tugas penembolokan (kanan), tugas pemulihan membutuhkan waktu sekitar 41 detik. Kami menambahkan tugas penembolokan ke alur kedua (kiri) dan mengonfigurasi tugas pemulihan untuk dijalankan saat cache meleset. Tugas pemulihan dalam kasus ini membutuhkan waktu 8 detik untuk diselesaikan.

Cuplikan layar memperlihatkan performa alur dengan dan tanpa penembolokan.

Di bawah ini adalah alur YAML lengkap untuk referensi:

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