# 開發工具越裝越多，npm、pip 和 Gradle 哪些檔案該留

專案還沒變大，C 槽卻多出了好幾個 GB。查到 npm、pip 或 Gradle 目錄以後，先別按快取兩個字整個刪。下載快取、專案相依、建置輸出和工具版本儲存的是不同東西。下一次建置能不能繼續，也取決於它們還能不能取得。

## 先找到工具實際使用的位置

在安裝了對應工具的終端機裡，可以用下面的命令查看 npm 快取位置和 pip 快取資訊。它們不執行刪除：

```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 快取 | 後續安裝可能重新下載，離線工作是否還需要 |
| 專案相依 | `node_modules`、虛擬環境、`vendor` | 套件、鎖定檔和來源是否足夠，安裝步驟能否重新完成 |
| 建置輸出 | `dist`、`build`、`obj` | 是否真是產生物，裡面有沒有手動放入的內容 |
| 工具版本與本機存放庫 | Gradle 下載版本、部分本機安裝套件 | 下次同步或建置是否直接依賴它們 |

能重新產生不等於沒有代價。網路、下載來源、驗證和離線條件都可能影響重建。專案裡的相依目錄也不是清理工具看到名稱以後就該統一移除的東西。

## 快取出問題，和相依出問題是兩回事

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 for Windows 會列出辨識到的 npm、pip 等快取。正在使用的內容保留，含有不能自動重建資料的專案等待確認。它不把所有專案相依目錄當成通用快取去刪。清理清單裡的一項也不授權結束電腦上所有 Node.js 或 Python 處理程序。

Gradle 的 `caches` 和 `wrapper\dists` 沒有放進 Mole 的清理範圍。它們可能正是 Android Studio 同步和下一次建置要用的內容。讓 Gradle 管理自己的保存週期，避免剛清完又把同一份版本下載回來。

自己的專案輸出需要按專案說明管理。上表解釋的是目錄的用途，不代表 Mole 會逐個掃描並自動刪除這些專案路徑。原始程式碼、設定、工作階段和本機模型也不能因為在開發目錄裡就當成快取。

## 清理以後，用原來的專案驗證

確認需要的檔案有獨立複本，再處理選取的快取，之後用同一個專案執行一次原來的安裝或建置，記錄是否需要重新下載。不要在馬上要離線簡報或出差前，把相依、工具版本和下載快取一起清空。

如果主要空間在虛擬磁碟、模型或大型輸出裡，繼續看[大檔查找指南](/tw/windows/blog/find-large-files-on-windows)。一般系統快取和個人資料的差別則放在[快取清理指南](/tw/windows/blog/windows-cache-cleanup)。


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