GitHub Actions 怎样缓存依赖并避免键冲突
在 GitHub Actions 中缓存依赖,应先确定缓存目录,再让 key 区分项目、系统、架构、运行时和锁文件。不要只写一个 npm-cache 通用键,也不要用过宽的 restore-keys 把不兼容环境重新混在一起。本文缓存 npm 下载包,安装依赖仍执行 npm ci。
官方地址:https://github.com/features/actions
缓存文档:https://docs.github.com/en/actions/reference/workflows-and-actions/dependency-caching;Action 官方仓库:https://github.com/actions/cache。配图是原创界面说明图,不是实际仓库截图或运行证明。
任务目标:缓存下载包,安装仍按锁文件执行
用一个原创示例仓库 catalog-web 说明:根目录已有 package.json、package-lock.json 和 build 脚本,GitHub Actions 已启用,操作者有提交工作流的权限。目标是减少重复下载,不承诺每次都命中,更不把缓存当成发布产物存储。
这里显式使用 .ci-cache/npm 作为下载缓存目录,便于 key 与 path 一起维护。示例选 GitHub 托管 Ubuntu 环境、Node 24;其他环境应按项目支持范围调整。Action 自身运行环境与被安装的 Node 版本是两回事,自托管 runner 要另行满足所用 Action 的运行要求。
步骤一:在仓库中打开工作流文件
进入目标仓库“Code → Add file → Create new file”,文件名填写 .github/workflows/dependency-cache.yml。已有工作流时,则在 Code 文件树中打开该文件并点击编辑入口,把缓存逻辑合并到原有构建 job,避免新增一条重复构建流程。

继续前确认文件编辑区域已出现,名称包含 .github/workflows 和 .yml。扩展名或目录拼错时,普通文件虽然能保存,也不会因此成为预期工作流。
步骤二:保存带命名空间的缓存配置
在文件内容区域填入下面的 YAML。它是供读者使用的完整示例,本文没有替任何仓库提交或运行。cache 的 key 与回退前缀都保留同一组隔离维度,只放宽最后的锁文件摘要。
name: Dependency cache build
# 默认分支上的手动入口,便于观察连续两次相同输入
on:
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node: ['24']
steps:
- uses: actions/checkout@v7
- uses: actions/setup-node@v7
with:
node-version: ${{ matrix.node }}
# 只保留下面这一套显式缓存,避免重复管理同一路径
package-manager-cache: false
- name: Check lockfile
shell: bash
run: |
# 防止锁文件路径写错后,多种依赖集合共用空摘要
test -f package-lock.json
- name: Restore npm downloads
id: npm-downloads
uses: actions/cache@v6
with:
path: .ci-cache/npm
key: catalog-web-npm-v1-${{ runner.os }}-${{ runner.arch }}-node${{ matrix.node }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
catalog-web-npm-v1-${{ runner.os }}-${{ runner.arch }}-node${{ matrix.node }}-
- name: Install locked dependencies
shell: bash
run: |
# 命中下载缓存也照常安装;缓存不等于 node_modules
npm ci --cache "$GITHUB_WORKSPACE/.ci-cache/npm" --prefer-offline
- name: Build project
run: |
# 使用项目已有构建脚本,失败应按真实日志处理
npm run build

key 的 catalog-web-npm-v1 是项目、包管理器和缓存规则版本的命名空间。系统与架构隔离运行环境,Node 维度区分项目选择,hashFiles 绑定当前锁文件。它们解决的是人为漏写维度造成的复用混淆,而不是宣称数学上绝无哈希碰撞。缓存还有服务端作用域及版本机制,key 不是唯一约束。
完成编辑后点击“Commit changes”,按仓库规则选择提交到默认分支,或先创建分支与 Pull Request 合并。界面应显示新提交及保存后的工作流文件。手动工作流入口要求工作流文件位于默认分支,未合并的文件不要直接当作已生效。
步骤三:在 Actions 查看命中与安装状态
进入“Actions → Dependency cache build → Run workflow”,选择分支并点击 Run workflow。待运行记录出现后打开该记录,再进入 build job,展开 Restore npm downloads、Install locked dependencies 和 Build project 三个步骤。

第一次没有匹配缓存是正常情况。使用组合 cache Action 时,未精确命中会在 job 成功完成后尝试保存当前 key;再次用相同输入运行,才有机会看到精确命中。缓存可能被清理、受作用域限制或没有成功保存,所以第二次仍需根据真实日志判断。
精确命中对应 cache-hit 的字符串 true;回退命中不应按精确命中处理。本文无论如何都安装依赖,因为缓存目录只是下载包。即使缓存里保留旧下载文件,npm ci 仍应根据锁文件安装目标依赖;不要给安装步骤加“命中就跳过”的条件。
常见问题与验收要点
| 情况 | 调整方式 |
|---|---|
| 不同子项目锁文件混用 | 给子项目独立前缀,并同步修改锁文件路径和安装工作目录 |
| 改了缓存目录却还沿用旧规则 | 检查 path,并升级前缀中的规则版本,如 v2 |
| 回退前缀只剩 npm- | 保留项目、系统、架构及运行时维度,避免重新放宽隔离 |
| 每次加运行编号导致一直未命中 | 让 key 绑定兼容性输入,而非每次必变的运行编号 |
| 多个并行 job 争用相同键 | 先区分需要独立内容的 job;同内容竞争保存也不意味着缓存损坏 |
相同 key 能覆盖旧缓存吗?
已有缓存内容不能原地修改。缓存规则或内容范围变更时,用新 key。并发保存时不要把“另一个 job 已先保存”误判为构建本身失败,应分别查看缓存步骤与业务步骤状态。
必须设置 restore-keys 吗?
不是。不希望复用旧锁文件下载缓存时可以移除,让命中条件更窄。回退只应服务于明确可兼容的数据,不能照搬到编译产物或带本机原生模块的安装目录。
为什么 key 一样却读不到缓存?
继续检查分支作用域、缓存路径、压缩相关版本及清理情况。不要通过放宽到一个全局前缀来掩盖原因。缓存中也不要存凭据、令牌和个人数据。
验收时分别确认三个事实:工作流已保存到正确位置,日志显示实际使用的缓存键与目录,安装和构建完成了各自的工作。缓存命中只反映复用情况,不能替代业务构建结果。
VS Code 源代码管理怎样查看文件变更对比
- 上一篇
- VS Code 源代码管理怎样查看文件变更对比
- 下一篇
- Docker Compose run 怎样执行一次性任务
-
- 文章 · 软件教程 | 30分钟前 | docker · 配置 · 环境变量 Docker Compose env_file
- Docker Compose 怎样使用 env_file 管理服务变量
- 271浏览 收藏
-
- 文章 · 软件教程 | 32分钟前 | vs code · 软件教程 · VS Code markdown 自动换行 语言专属设置 editor.wordWrap
- VS Code 怎样只对 Markdown 文件开启自动换行
- 206浏览 收藏
-
- 文章 · 软件教程 | 36分钟前 |
- VS Code 文件嵌套怎样把同名产物收进源文件
- 316浏览 收藏
-
- 文章 · 软件教程 | 52分钟前 | git ·
- Git rebase --autosquash 怎样整理修复提交
- 484浏览 收藏
-
- 文章 · 软件教程 | 54分钟前 |
- DBeaver 怎样把查询结果导出为 CSV
- 240浏览 收藏
-
- 文章 · 软件教程 | 56分钟前 |
- Postman 怎样查看请求响应时间
- 278浏览 收藏
-
- 文章 · 软件教程 | 59分钟前 | 软件教程 · Docker Compose 一次性任务 docker compose run
- Docker Compose run 怎样执行一次性任务
- 479浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code 源代码管理怎样查看文件变更对比
- 397浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code 调试控制台怎样执行多行表达式
- 328浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code Tasks 怎样保存可复用的构建命令
- 130浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | 开发工具 · vs code · VS Code glob Files to include 搜索文件夹
- VS Code 怎样把搜索结果限制在指定文件夹
- 265浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- VS Code 怎样只对当前文件启用格式化工具
- 201浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 852次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 858次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 938次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 913次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 743次使用
-
- VS Code 怎么给 Go 项目配置测试任务:tasks.json 运行与结果验收
- 2026-07-09 501浏览
-
- Windows 11 如何开启 HEIF 图片支持
- 2026-05-31 501浏览
-
- TikTok用户画像与付费订阅变现方法
- 2026-05-27 501浏览
-
- 学信网学历翻译件申请方法
- 2026-05-27 501浏览
-
- Windows 11 24H2 更新失败0x80070005解决方法
- 2026-05-26 501浏览

