GitHub Actions的Cache缓存为什么总是显示“Not found”?

司空耘郗 阅读 27

我在项目里配置了GitHub Actions的npm缓存,但每次构建时都提示Cache not found for input keys,明明之前成功过几次啊?

场景是这样的:前端Vue项目用npm,按照官方文档设置了缓存:

# workflow步骤片段
- name: Cache npm dependencies
  uses: actions/cache@v3
  with:
    path: node_modules
    key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-npm-

昨天修改了package.json里的一个开发依赖,提交后缓存突然失效了。我试过手动清理缓存,也确认路径没错,但新构建还是每次都重新install依赖,这不挺浪费时间的嘛…

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
筱萌 Dev
这个问题很常见,主要是因为key的变化导致缓存匹配不上。你看,你用的是${{ hashFiles('**/package-lock.json') }}来生成key,而昨天修改了package.json里的依赖,这会直接导致package-lock.json发生变化,从而生成一个新的key。新key和之前的缓存key对不上,自然就显示“Not found”了。

标准写法其实你已经用了,但可以稍微调整一下策略。比如在restore-keys里多加一层容错:

- name: Cache npm dependencies
uses: actions/cache@v3
with:
path: node_modules
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-
${{ runner.os }}-


这样做的意思是,如果精确的key找不到,就会尝试用更宽泛的restore-keys去匹配之前的缓存。虽然可能不是完全匹配的依赖,但至少能减少重复安装的时间。

另外,提醒一下,如果你经常修改依赖,可以考虑把package-lock.json的hash改为package.json的hash,这样影响范围会小一点。不过这要看你的项目具体情况了。

最后,别忘了GitHub Actions的缓存是有生命周期的(默认14天),如果长时间没跑构建,缓存也可能被清理掉。这点文档里是有提到的,但很容易忽略...
点赞 9
2026-02-02 16:13