当前位置:首页 > 文章列表 > 文章 > 软件教程 > GitHub Actions 怎样缓存依赖并避免键冲突

GitHub Actions 怎样缓存依赖并避免键冲突

来源:17golang原创 2026-11-03 06:36:24 0浏览 收藏

在 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,避免新增一条重复构建流程。

仓库Code中的工作流文件创建入口与路径
操作说明图:在仓库文件区创建 .github/workflows 下的 YAML 文件;确认路径属于目标仓库后再编辑。

继续前确认文件编辑区域已出现,名称包含 .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
工作流编辑区突出缓存路径键和受限回退前缀
配置说明图:path、key 与 restore-keys 各司其职,完整 YAML 以上方文字为准;右上角 Commit changes 用于保存提交。

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 三个步骤。

Actions运行详情中的缓存安装和构建步骤查看入口
结果查看说明图:分别展开缓存、安装和构建步骤读取真实状态;图中只说明查看位置,不编造命中记录、耗时或成功结果。

第一次没有匹配缓存是正常情况。使用组合 cache Action 时,未精确命中会在 job 成功完成后尝试保存当前 key;再次用相同输入运行,才有机会看到精确命中。缓存可能被清理、受作用域限制或没有成功保存,所以第二次仍需根据真实日志判断。

精确命中对应 cache-hit 的字符串 true;回退命中不应按精确命中处理。本文无论如何都安装依赖,因为缓存目录只是下载包。即使缓存里保留旧下载文件,npm ci 仍应根据锁文件安装目标依赖;不要给安装步骤加“命中就跳过”的条件。

常见问题与验收要点

情况调整方式
不同子项目锁文件混用给子项目独立前缀,并同步修改锁文件路径和安装工作目录
改了缓存目录却还沿用旧规则检查 path,并升级前缀中的规则版本,如 v2
回退前缀只剩 npm-保留项目、系统、架构及运行时维度,避免重新放宽隔离
每次加运行编号导致一直未命中让 key 绑定兼容性输入,而非每次必变的运行编号
多个并行 job 争用相同键先区分需要独立内容的 job;同内容竞争保存也不意味着缓存损坏

相同 key 能覆盖旧缓存吗?

已有缓存内容不能原地修改。缓存规则或内容范围变更时,用新 key。并发保存时不要把“另一个 job 已先保存”误判为构建本身失败,应分别查看缓存步骤与业务步骤状态。

必须设置 restore-keys 吗?

不是。不希望复用旧锁文件下载缓存时可以移除,让命中条件更窄。回退只应服务于明确可兼容的数据,不能照搬到编译产物或带本机原生模块的安装目录。

为什么 key 一样却读不到缓存?

继续检查分支作用域、缓存路径、压缩相关版本及清理情况。不要通过放宽到一个全局前缀来掩盖原因。缓存中也不要存凭据、令牌和个人数据。

验收时分别确认三个事实:工作流已保存到正确位置,日志显示实际使用的缓存键与目录,安装和构建完成了各自的工作。缓存命中只反映复用情况,不能替代业务构建结果。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
VS Code 源代码管理怎样查看文件变更对比VS Code 源代码管理怎样查看文件变更对比
上一篇
VS Code 源代码管理怎样查看文件变更对比
Docker Compose run 怎样执行一次性任务
下一篇
Docker Compose run 怎样执行一次性任务
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    852次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    858次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    938次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    913次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    743次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码