开发工具越装越多,npm、pip 和 Gradle 的哪些文件该留
自己的业务代码没写多少,C 盘却不知不觉少了几十个 G。顺着路径一查,往往是 npm、pip 或 Gradle 悄悄占了大头。不过看到“Cache”字样千万别闭着眼睛一键全删。包下载缓存、项目本地依赖、构建产物和工具版本完全是几码事,删错了可能导致离线断网时连项目都跑不起来。
看看这些工具把缓存放哪了
在常用的终端里敲下面两行命令,就能查到当前环境的缓存位置(只读取配置,不会删除任何文件):
npm config get cache
python -m pip cache info
当前 python 选中了哪一套 pip,查询就使用它的配置,但缓存目录仍可能与其他环境共用。npm 配置说明和 pip 缓存说明对各自机制都有说明。
四类开发目录分开看
| 类型 | 常见例子 | 清理前要注意 |
|---|---|---|
| 包下载缓存 | npm 缓存、pip 的 HTTP 与 wheel 缓存 | 下次 install 会重新拉取,断网或离线工作时是否还需要 |
| 项目依赖 | node_modules、venv 虚拟环境、vendor |
重新安装需要网络和锁文件,别当成普通垃圾删 |
| 构建产物 | dist、build、bin、obj |
项目生成的输出,按项目说明清理,先确认没有手动放进去的文件 |
| 工具链与本地库 | Gradle 下载的各种 wrapper 版本 | 下次打开 IDE 是否直接依赖它们同步工程 |
能重新下载并不代表没有成本。内外网切换、私有源 Token 过期、或者在外没有稳定 Wi-Fi 时,重新拉取都会让人抓狂。
包缓存出了问题,和依赖版本错了不是一回事
npm 的下载缓存带有完整性校验,官方说明介绍了它遇到损坏内容时重新获取的机制,所以安装报错不等于先把缓存全删掉。网络访问失败、锁文件指定的版本不存在和项目依赖冲突,清空缓存以后仍然可能原样报错。
pip 又有两类容易混淆的缓存,HTTP 缓存保存下载响应,wheel 缓存保存可安装的包,包括本机曾经构建的结果。pip 的缓存说明也明确区分它们,pip cache list 主要列出 wheel,不能拿这份清单当整个缓存目录的文件清单。
虚拟环境隔离的是安装进去的依赖,pip 缓存却可能由几个环境共用,换了 python 不代表缓存目录一定换了。以查询命令的实际输出为准,别在删除一个旧虚拟环境时顺手把共享缓存也算进去。
锁文件能记录版本,不能替你保存安装包
举个离线工作的例子,项目里还留着 package-lock.json,但 node_modules 和下载缓存都没了,版本记录虽然完整,安装所需的包却可能拿不到。锁文件解决的是依赖版本的选择,不是包文件的备份,私有源停止服务或权限过期也会影响重装。
Gradle 的依赖缓存文档说明了离线模式需要本地已经具备所需依赖,而目录与保留策略区分版本缓存、共享依赖和 Wrapper。遇到 .gradle 占用大,先看是哪一类增长,工具已经管理的旧缓存与项目还在使用的依赖,不该一锅端。
Mole 替你管什么,把什么留给原生工具
Mole 会扫描识别出来的 npm、pip 等包管理器的离线包缓存。正在被读写的文件会自动跳过;包含不可自动重建数据的目录会留给你手动确认。Mole 绝不会把项目自身的 node_modules 当成通用垃圾乱删,更不会擅自强杀正在运行的 Node.js 或 Python 进程。
至于 Gradle 的 caches 和 wrapper\dists,Mole 刻意没有纳入清理范围。因为它们是 Android Studio 同步和构建的基石,交给 Gradle 自己管理生命周期更踏实,免得今天清完、明天开 IDE 又慢吞吞下载几十分钟。
出差或离线办公前,先别大扫除
清理缓存前,先想想接下来几天有没有断网办公、高铁出差的需求。如果马上要干活,别在这时把下载缓存全清空。清完后不妨挑个常用项目试跑一次 install 或 build,确认开发环境顺畅如初。
如果真正占地方的是 WSL2、Docker 的虚拟磁盘或者本地大模型文件,可以看大文件排查指南;系统常规缓存的清理逻辑见缓存清理指南。