You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 04:03:17