# 开发工具越装越多，npm、pip 和 Gradle 的哪些文件该留

自己的业务代码没写多少，C 盘却不知不觉少了几十个 G。顺着路径一查，往往是 npm、pip 或 Gradle 悄悄占了大头。不过看到“Cache”字样千万别闭着眼睛一键全删。包下载缓存、项目本地依赖、构建产物和工具版本完全是几码事，删错了可能导致离线断网时连项目都跑不起来。

## 看看这些工具把缓存放哪了

在常用的终端里敲下面两行命令，就能查到当前环境的缓存位置（只读取配置，不会删除任何文件）：

```powershell
npm config get cache
python -m pip cache info
```

当前 `python` 选中了哪一套 pip，查询就使用它的配置，但缓存目录仍可能与其他环境共用。[npm 配置说明](https://docs.npmjs.com/cli/v11/commands/npm-config/)和 [pip 缓存说明](https://pip.pypa.io/en/stable/cli/pip_cache/)对各自机制都有说明。

## 四类开发目录分开看

| 类型 | 常见例子 | 清理前要注意 |
| --- | --- | --- |
| 包下载缓存 | npm 缓存、pip 的 HTTP 与 wheel 缓存 | 下次 install 会重新拉取，断网或离线工作时是否还需要 |
| 项目依赖 | `node_modules`、venv 虚拟环境、`vendor` | 重新安装需要网络和锁文件，别当成普通垃圾删 |
| 构建产物 | `dist`、`build`、`bin`、`obj` | 项目生成的输出，按项目说明清理，先确认没有手动放进去的文件 |
| 工具链与本地库 | Gradle 下载的各种 wrapper 版本 | 下次打开 IDE 是否直接依赖它们同步工程 |

能重新下载并不代表没有成本。内外网切换、私有源 Token 过期、或者在外没有稳定 Wi-Fi 时，重新拉取都会让人抓狂。

## 包缓存出了问题，和依赖版本错了不是一回事

npm 的下载缓存带有完整性校验，[官方说明](https://docs.npmjs.com/cli/v11/commands/npm-cache/)介绍了它遇到损坏内容时重新获取的机制，所以安装报错不等于先把缓存全删掉。网络访问失败、锁文件指定的版本不存在和项目依赖冲突，清空缓存以后仍然可能原样报错。

pip 又有两类容易混淆的缓存，HTTP 缓存保存下载响应，wheel 缓存保存可安装的包，包括本机曾经构建的结果。[pip 的缓存说明](https://pip.pypa.io/en/stable/topics/caching/)也明确区分它们，`pip cache list` 主要列出 wheel，不能拿这份清单当整个缓存目录的文件清单。

虚拟环境隔离的是安装进去的依赖，pip 缓存却可能由几个环境共用，换了 `python` 不代表缓存目录一定换了。以查询命令的实际输出为准，别在删除一个旧虚拟环境时顺手把共享缓存也算进去。

## 锁文件能记录版本，不能替你保存安装包

举个离线工作的例子，项目里还留着 `package-lock.json`，但 `node_modules` 和下载缓存都没了，版本记录虽然完整，安装所需的包却可能拿不到。锁文件解决的是依赖版本的选择，不是包文件的备份，私有源停止服务或权限过期也会影响重装。

Gradle 的[依赖缓存文档](https://docs.gradle.org/current/userguide/dependency_caching.html)说明了离线模式需要本地已经具备所需依赖，而[目录与保留策略](https://docs.gradle.org/current/userguide/directory_layout.html)区分版本缓存、共享依赖和 Wrapper。遇到 `.gradle` 占用大，先看是哪一类增长，工具已经管理的旧缓存与项目还在使用的依赖，不该一锅端。

<figure class="blog-diagram">
  <picture>
    <source media="(max-width: 900px)" srcset="/img/blog/windows-windows-developer-caches-zh-mobile.webp" type="image/webp" width="768" height="1500">
    <img src="/img/blog/windows-windows-developer-caches-zh.webp" width="1360" height="454" loading="lazy" alt="开发目录不能都当成缓存">
  </picture>
  <figcaption>四类目录服务于不同任务，锁文件记录版本，不能替代软件包和工具链的本地副本。</figcaption>
</figure>

## Mole 替你管什么，把什么留给原生工具

Mole 会扫描识别出来的 npm、pip 等包管理器的离线包缓存。正在被读写的文件会自动跳过；包含不可自动重建数据的目录会留给你手动确认。Mole 绝不会把项目自身的 `node_modules` 当成通用垃圾乱删，更不会擅自强杀正在运行的 Node.js 或 Python 进程。

至于 Gradle 的 `caches` 和 `wrapper\dists`，Mole 刻意没有纳入清理范围。因为它们是 Android Studio 同步和构建的基石，交给 Gradle 自己管理生命周期更踏实，免得今天清完、明天开 IDE 又慢吞吞下载几十分钟。

## 出差或离线办公前，先别大扫除

清理缓存前，先想想接下来几天有没有断网办公、高铁出差的需求。如果马上要干活，别在这时把下载缓存全清空。清完后不妨挑个常用项目试跑一次 `install` 或 `build`，确认开发环境顺畅如初。

如果真正占地方的是 WSL2、Docker 的虚拟磁盘或者本地大模型文件，可以看[大文件排查指南](/zh/windows/blog/find-large-files-on-windows)；系统常规缓存的清理逻辑见[缓存清理指南](/zh/windows/blog/windows-cache-cleanup)。


Canonical: https://mole.fit/zh/windows/blog/windows-developer-caches
