다음을 통해 공유


NuGet 패키지 캐시

Azure DevOps Services

파이프라인 캐싱을 사용하면 이후 실행에서 다시 사용할 종속성을 캐싱하여 빌드 시간을 줄일 수 있습니다. 이 문서에서는 캐시 작업을 사용하여 NuGet 패키지를 캐시하고 복원하는 방법을 알아봅니다.

참고 항목

파이프라인 캐싱은 YAML 및 클래식 파이프라인 모두에 대한 에이전트 풀 작업에서 지원됩니다. 그러나 클래식 릴리스 파이프라인에서는 지원되지 않습니다.

종속성 잠금

캐시 작업을 설정하려면 먼저 프로젝트의 종속성을 잠그고 package.lock.json 파일을 만들어야 합니다. 이 파일의 콘텐츠 해시를 사용하여 캐시에 대한 고유 키를 생성합니다.

프로젝트의 종속성을 잠그려면 csproj 파일의 RestorePackagesWithLockFile 속성을 true설정합니다. NuGet 복원은 프로젝트의 루트 디렉터리에 packages.lock.json 잠금 파일을 생성합니다. packages.lock.json 파일을 소스 코드로 확인해야 합니다.

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

NuGet 패키지 캐시

파이프라인을 실행하는 에이전트에서 패키지의 위치를 가리키는 파이프라인 변수를 만들어야 합니다.

이 예제에서는 동적 캐시 키를 생성하기 위해 packages.lock.json 콘텐츠가 해시됩니다. 이렇게 하면 파일이 수정될 때마다 새 캐시 키가 생성됩니다.

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'

참고 항목

캐시는 변경할 수 없으며 캐시가 만들어지면 해당 콘텐츠를 수정할 수 없습니다.

캐시 복원

이 작업은 변수가 false인 CACHE_RESTORED 경우에만 실행됩니다.

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

빌드 작업 중에 "project.assets.json 찾을 수 없음" 오류 메시지가 표시되면 복원 작업에서 조건을 condition: ne(variables.CACHE_RESTORED, true) 제거하여 해결할 수 있습니다. 이렇게 하면 복원 명령이 실행되어 project.assets.json 파일이 생성됩니다. 복원 작업은 해당 폴더에 이미 있는 패키지를 다운로드하지 않습니다.

참고 항목

파이프라인은 하나 이상의 캐싱 작업을 포함할 수 있으며 동일한 파이프라인 내의 작업 및 태스크는 동일한 캐시에 액세스하고 공유할 수 있습니다.

성능 비교

파이프라인 캐싱은 파이프라인 실행 속도를 높일 수 있는 좋은 방법입니다. 다음은 두 개의 서로 다른 파이프라인에 대한 병렬 성능 비교입니다. 캐싱 작업(오른쪽)을 추가하기 전에 복원 작업은 약 41초가 걸렸습니다. 캐싱 태스크를 두 번째 파이프라인(왼쪽)에 추가하고 캐시 누락이 발생할 때 실행되도록 복원 작업을 구성했습니다. 이 경우 복원 작업을 완료하는 데 8초가 걸렸습니다.

캐싱을 사용 및 사용하지 않는 파이프라인 성능을 보여 주는 스크린샷.

다음은 참조할 전체 YAML 파이프라인입니다.

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