Nx 17.0.0 缓存目录迁移指南:从 `node_modules/.cache/nx` 到 `.nx/cache`

发布时间:2026/9/12 12:15:34

Nx 17.0.0 缓存目录迁移指南:从 `node_modules/.cache/nx` 到 `.nx/cache` Nx 17.0.0 缓存目录迁移指南从node_modules/.cache/nx到.nx/cache【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx本文基于 Nx 官方仓库中move-cache-directory.md迁移文档深入讲解 Nx 17.0.0 将默认任务缓存目录迁移到.nx/cache的背景、自动迁移机制、.gitignore/.prettierignore的同步处理以及手工迁移的完整步骤。读完本文你将理解 Nx 缓存目录的解析逻辑与底层实现并掌握在任何工作区中正确配置、忽略和验证.nx/cache的实战能力。一、为什么 Nx 17.0.0 要移动缓存目录从 Nx 17.0.0 起Nx 的默认缓存目录由原来的node_modules/.cache/nx迁移为工作区根目录下的.nx/cache。这一调整是 Nx 对工作区本地数据统一归置的一部分——缓存不再与node_modules耦合而是集中存放于独立的.nx目录中。在官方迁移注册表 packages/nx/migrations.json 中本次迁移被登记为17.0.0-move-cache-directory: { cli: nx, version: 17.0.0-beta.1, description: Updates the default cache directory to .nx/cache, implementation: ./dist/src/migrations/update-17-0-0/move-cache-directory, documentation: ./dist/src/migrations/update-17-0-0/move-cache-directory.md }可见其官方描述正是Updates the default cache directory to .nx/cache版本门槛为17.0.0-beta.1说明该变更在 17.0.0 开发周期早期就已落地。二、迁移源码剖析迁移器到底做了什么迁移的实际逻辑位于 packages/nx/src/migrations/update-17-0-0/move-cache-directory.ts完整流程如下export default function moveCacheDirectory(tree: Tree) { // 若仓库只有 lerna.json 而没有 nx.json则跳过迁移 if (tree.exists(lerna.json) !tree.exists(nx.json)) { return; } updateGitIgnore(tree); if (tree.exists(.prettierignore)) { const ignored tree.read(.prettierignore, utf-8); if (!ignored.includes(.nx/cache)) { tree.write(.prettierignore, [ignored, /.nx/cache].join(\n)); } } }1. Lerna 特例不强制迁移迁移器首先检查lerna.json是否存在且nx.json不存在。若满足该条件则直接返回。源码注释解释了原因如果仓库没有nx.json则无法利用 Nx 缓存.nx/cache意义不大对于尚未完全切换到 Nx 的 Lerna 用户突然出现.nx目录可能造成困扰。这条特例逻辑在cache-directory.ts的运行时解析中也有完全一致的对应实现if ( existsSync(join(root, lerna.json)) !existsSync(join(root, nx.json)) ) { return join(root, node_modules, .cache, nonNxCacheDirectory); } return join(root, .nx, nxCacheDirectory);也就是说运行时与迁移器对 Lerna 场景的判断保持一致——纯 Lerna 仓库继续使用node_modules/.cache/nx只有真正启用了 Nx存在nx.json的仓库才使用.nx/cache。这保证了迁移器不会对不适用新缓存路径的仓库做无意义修改。2. 更新.gitignore基于 ignore 库的智能判断迁移器调用updateGitIgnore处理.gitignorefunction updateGitIgnore(tree: Tree) { const gitignore tree.exists(.gitignore) ? tree.read(.gitignore, utf-8) : ; const ig ignore(); ig.add(gitignore); if (!ig.ignores(.nx/cache)) { const updatedLines gitignore.length ? [gitignore, .nx/cache] : [.nx/cache]; tree.write(.gitignore, updatedLines.join(\n)); } }值得注意的实现细节迁移器使用ignore库解析现有.gitignore规则再判断.nx/cache是否已经被现有规则覆盖例如已有的.*/cache或.nx/模式。只有未被覆盖时才追加.nx/cache行避免产生重复或冗余规则。3. 更新.prettierignore仅在文件存在时追加对.prettierignore的处理更保守仅当文件已存在时才读取并追加/.nx/cache注意带前导/表示仓库根目录下的精确路径且同样先检查是否已包含.nx/cache以避免重复写入。若.prettierignore不存在则不做任何创建。三、官方文档中的样例变更原文档核心move-cache-directory.md文档给出了两个标准的手工修改样例与迁移器行为一一对应。样例 1在.gitignore中添加.nx/cacheBefore迁移前node_modulesAfter迁移后node_modules .nx/cache样例 2在.prettierignore中添加.nx/cacheBefore迁移前/distAfter迁移后/dist .nx/cache这两处改动确保了缓存目录不会污染 Git 提交也不会被 Prettier 格式化遍历。四、测试验证迁移器行为的 7 个边界场景迁移器的全部行为都由单元测试覆盖测试文件位于 packages/nx/src/migrations/update-17-0-0/move-cache-directory.spec.ts共 7 个用例场景前置状态预期行为向 gitignore 添加缓存目录.gitignore内容为node_modules追加为node_modules\n.nx/cache.gitignore不存在文件被删除新建文件内容仅为.nx/cache已直接忽略.gitignore已有node_modules\n.nx/cache不重复追加保持原样已被其他模式忽略.gitignore已有.*/cache不追加智能识别Lerna 仓库无 nx.json存在lerna.json且无nx.json完全不修改.gitignore处理 prettierignore.prettierignore内容为/dist追加为/dist\n/.nx/cacheprettierignore 不存在文件被删除不创建文件这些测试直接印证了迁移器幂等、智能、保守的设计重复运行不会产生重复条目已有通配规则会覆盖新路径纯 Lerna 仓库不受影响。五、运行时如何解析缓存目录底层原理迁移之后Nx 在每次运行时是如何确定缓存目录位置的答案在 packages/nx/src/utils/cache-directory.ts 中。1. 默认解析链function cacheDirectory(root: string, cacheDirectory: string) { const cacheDirFromEnv process.env.NX_CACHE_DIRECTORY; if (cacheDirFromEnv) { cacheDirectory cacheDirFromEnv; } if (cacheDirectory) { return absolutePath(root, cacheDirectory); } else { return defaultCacheDirectory(root); } }解析优先级从高到低为环境变量NX_CACHE_DIRECTORY最高优先级适用于 CI 或临时覆盖场景配置文件cacheDirectory读取nx.json中的cacheDirectory字段或旧的tasksRunnerOptions.default.options.cacheDirectory见readCacheDirectoryProperty默认值workspaceRoot/.nx/cacheLerna 特例为node_modules/.cache/nx。2.nx.json中的配置入口在 packages/nx/src/config/nx-json.ts 中cacheDirectory是NxJsonConfiguration的公开配置项/** * Changes the directory used by Nx to store its cache. */ cacheDirectory?: string;需要自定义缓存位置的工作区可在nx.json中配置{ cacheDirectory: .cache/nx-custom }该配置需与默认值一样通过.gitignore忽略可通过.nx/cache之外的规则例如.cache/。3. 环境变量NX_CACHE_DIRECTORY在 CI 或需要临时隔离缓存的场景下可通过环境变量强制指定NX_CACHE_DIRECTORY/tmp/nx-cache nx build my-app环境变量的优先级高于nx.json中的cacheDirectory配置。六、手工迁移与验证完整操作步骤若你的工作区因某些原因未自动执行迁移例如使用了旧版 Nx 或手动管理的仓库可按下述步骤手工迁移步骤 1确认当前缓存位置# 查看当前缓存目录若显示 node_modules/.cache/nx 则需要迁移 nx reset --help # 观察 .nx 目录是否已生成 ls -la .nx步骤 2更新.gitignore在.gitignore末尾追加一行.nx/cache步骤 3更新.prettierignore若存在该文件在.prettierignore末尾追加/.nx/cache步骤 4清理旧缓存并验证# 触发迁移升级到 Nx 17 后运行 nx migrate latest # 验证缓存写入新位置 nx build my-app ls .nx/cache若看到.nx/cache下生成了哈希命名的缓存文件说明迁移成功。七、清理缓存nx reset与缓存目录的关系迁移后nx reset命令会同时清理新旧两种路径下的缓存。在 packages/nx/src/command-line/reset/reset.ts 中有明确注释rmSync(cacheDir, { recursive: true, force: true }); // cacheDir is the shared directory whenever sharing is available, so // this is the checkouts own .nx/cache: still there from before the // move, and still what a later run falls back to if ~/.nx stops being // available. removeIfDistinct(cacheDirectoryForWorkspace(workspaceRoot), cacheDir);可见 Nx 在清理时会同时处理共享缓存与工作区自身的.nx/cache确保升级迁移期间产生的旧缓存残留也能被清除。八、总结Nx 17.0.0 的缓存目录迁移是 Nx 将缓存从node_modules解耦、归入.nx目录的重要一步迁移器move-cache-directory.ts自动为.gitignore追加.nx/cache、为已有的.prettierignore追加/.nx/cache智能幂等使用 ignore 库判断是否已被现有规则覆盖重复运行不会产生重复条目Lerna 特例纯 Lerna 仓库无nx.json不迁移保持node_modules/.cache/nx运行时一致性cache-directory.ts中的默认路径解析与迁移器共享同一套判断逻辑确保迁移前后行为一致可配置性可通过nx.json的cacheDirectory或环境变量NX_CACHE_DIRECTORY自定义缓存位置。无论你是刚刚升级到 Nx 17 的存量用户还是需要手工管理缓存目录的维护者遵循.gitignore添加.nx/cache、.prettierignore添加/.nx/cache两条规则即可保证工作区干净、缓存可复现。/output文章【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/12 13:10:36

Java面向对象编程:继承与多态的核心原理与实践

1. 继承与多态的核心概念在面向对象编程(OOP)中,继承和多态是两个最基础也最重要的特性。它们共同构成了代码复用和扩展的基石,让程序设计变得更加灵活和高效。继承就像生物学中的遗传机制。当创建一个新类时,不需要从零开始编写所有代码&…

2026/9/12 13:10:36

STM32F103驱动AD5272数字电位器:SPI时序、增益校准与工程实践

简介:面向电子设计竞赛(电赛)中的数字电位器控制场景,这份资源以STM32F103单片机为控制核心,提供AD5272数字电位器的I2C总线驱动与工程实现方案。内容覆盖I2C接口初始化、寄存器配置、数据帧构造与阻值读写等关键环节&…

2026/9/12 13:10:36

Linux进程创建:fork()机制深度解析与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 13:10:36

STT-MRAM替代低功耗SRAM:掉电不丢数据的嵌入式存储方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码