如何在Azure DevOps流水线阶段间正确缓存NuGet文件
Azure DevOps NuGet缓存失效问题解决方案
修正后的完整YAML配置
variables: # 全局设置NuGet包缓存路径,确保所有阶段/任务都继承 NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages # 用根目录packages.lock.json的哈希作为缓存Key,确保依赖变化时缓存更新 cache_key: 'nuget | "$(Agent.OS)" | $(Build.SourcesDirectory)/packages.lock.json' stages: - stage: Restore_Cache displayName: 还原并缓存NuGet包 jobs: - job: Restore_Cache pool: vmImage: "windows-latest" steps: - task: NuGetToolInstaller@1 displayName: 安装NuGet工具 - task: NuGetAuthenticate@1 displayName: NuGet身份验证 inputs: nuGetServiceConnections: "My Nuget Server" # 管理缓存:先尝试恢复,未命中则后续restore后自动保存 - task: Cache@2 displayName: 管理NuGet缓存 inputs: key: '$(cache_key)' restoreKeys: | nuget | "$(Agent.OS)" nuget path: '$(NUGET_PACKAGES)' cacheHitVar: 'CACHE_HIT' # 仅缓存未命中时执行restore,减少冗余操作 - task: DotNetCoreCLI@2 displayName: 还原NuGet包 condition: ne(variables.CACHE_HIT, 'true') inputs: command: 'restore' projects: 'My.Api.sln' feedsToUse: "select" vstsFeed: "<REDACTED>" arguments: '--use-lock-file' - stage: Build displayName: 构建API dependsOn: Restore_Cache condition: succeeded() jobs: - job: Build pool: vmImage: "windows-latest" steps: - task: NuGetToolInstaller@1 displayName: 安装NuGet工具 - task: NuGetAuthenticate@1 displayName: NuGet身份验证 inputs: nuGetServiceConnections: "My Nuget Server" # 恢复缓存 - task: Cache@2 displayName: 恢复NuGet缓存 inputs: key: '$(cache_key)' restoreKeys: | nuget | "$(Agent.OS)" nuget path: '$(NUGET_PACKAGES)' cacheHitVar: 'CACHE_HIT' # 从缓存还原,禁止远程下载 - task: DotNetCoreCLI@2 displayName: 从缓存还原包 inputs: command: 'restore' projects: 'My.Api.sln' feedsToUse: "select" vstsFeed: "<REDACTED>" arguments: '--use-lock-file --no-cache' - task: DotNetCoreCLI@2 displayName: 构建项目 inputs: projects: My.Api.csproj arguments: "--configuration Release --no-restore"
关键修正说明
- 全局缓存路径:把
NUGET_PACKAGES设为全局变量,确保所有任务都能读取到自定义缓存目录,避免部分任务仍使用默认路径。 - 精准缓存Key:直接用根目录的
packages.lock.json生成Key,避免通配符匹配错误,确保依赖变更时缓存自动更新。 - 条件执行Restore:缓存命中时跳过restore,减少不必要的网络请求;添加
--use-lock-file强制遵循依赖版本,保证缓存包与项目匹配。 - Build阶段强制读缓存:restore时加
--no-cache参数,禁止NuGet从远程源下载,只读取本地缓存目录。 - 移除冗余目录创建:
Cache@2会自动创建缓存路径,手动创建可能引发冲突。
关于library-packs错误的说明
这个错误是.NET SDK包的默认读取路径导致的,这类包不属于NuGet全局缓存范畴,不影响业务包的缓存使用。如果要消除错误,确保使用的.NET SDK版本与虚拟机镜像预装版本一致即可。
内容的提问来源于stack exchange,提问作者MRichards
相关产品推荐
相关产品推荐

