Azure Cache@2任务报错:未找到匹配packages.lock.json相关文件
问题描述
我参照Azure DevOps的NuGet缓存示例配置了Cache@2任务,YAML代码如下:
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'
执行任务时出现错误,错误日志如下:
2023-10-30T18:10:38.7068066Z ##[section]Starting: NuGet Cache 2023-10-30T18:10:38.7210499Z ============================================================================== 2023-10-30T18:10:38.7210902Z Task : Cache 2023-10-30T18:10:38.7211034Z Description : Cache files between runs 2023-10-30T18:10:38.7211269Z Version : 2.198.0 2023-10-30T18:10:38.7211412Z Author : Microsoft Corporation 2023-10-30T18:10:38.7211625Z Help : https://aka.ms/pipeline-caching-docs 2023-10-30T18:10:38.7211912Z ============================================================================== 2023-10-30T18:10:39.1559570Z Resolving key: 2023-10-30T18:10:39.1771434Z - nuget [string] 2023-10-30T18:10:39.1776896Z - "Windows_NT" [string] 2023-10-30T18:10:39.2982850Z - **/packages.lock.json,!**/bin/**,!**/obj/** [file pattern; matches: 0] 2023-10-30T18:10:39.3161650Z ##[error]One or several exceptions have been occurred. 2023-10-30T18:10:39.3182795Z ##[error]System.IO.FileNotFoundException: No matching files found for pattern: **/packages.lock.json,!**/bin/**,!**/obj/** 2023-10-30T18:10:39.3214721Z ##[section]Finishing: NuGet Cache
原因分析
错误日志明确显示找不到匹配指定模式的文件,核心原因有两点:
- 项目未生成
packages.lock.json文件:该文件是NuGet锁定依赖的专用文件,仅在启用NuGet锁定模式时才会生成,默认情况下多数项目不会自动创建。 - 路径匹配异常:即使存在
packages.lock.json,若流水线执行Cache任务时的工作目录不正确,或文件不在仓库预期路径下,也会导致匹配失败。
解决方法
方法一:生成并提交packages.lock.json到仓库
若要基于packages.lock.json实现缓存,需先在项目中启用NuGet锁定模式:
- 本地项目操作:
- 终端执行(适用于.NET项目):
dotnet restore --use-lock-file - 或在Visual Studio中:右键项目 → 「管理NuGet程序包」→ 右上角设置图标 → 「NuGet包管理器」设置中勾选「启用锁定文件」,重新还原依赖后生成
packages.lock.json。
- 终端执行(适用于.NET项目):
- 将生成的
packages.lock.json提交到Git仓库,确保流水线拉取代码时能获取到该文件。
方法二:改用其他缓存键(不依赖packages.lock.json)
若无需使用锁定文件,可改用项目的.csproj或NuGet.config作为缓存键的匹配项,示例修改后的YAML:
variables: NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages - task: Cache@2 displayName: Cache NuGet packages inputs: key: 'nuget | "$(Agent.OS)" | **/*.csproj,!**/bin/**,!**/obj/**' restoreKeys: | nuget | "$(Agent.OS)" nuget path: '$(NUGET_PACKAGES)' cacheHitVar: 'CACHE_RESTORED'
可根据项目实际情况替换为**/NuGet.config等其他合适的文件匹配模式。
额外检查点
- 确保流水线在执行Cache任务前已完成代码拉取(如
Checkout任务),否则本地无项目文件必然匹配失败。 - 验证
packages.lock.json的路径是否符合**/packages.lock.json的匹配规则,确认排除规则!**/bin/**,!**/obj/**是否正确排除了无关路径。
内容的提问来源于stack exchange,提问作者user1867382
相关产品推荐
相关产品推荐

