# 清除開發者快取而不破壞建置

> 清理套件快取和專案相依套件前，先保留原始碼與鎖定檔，確認仍能下載套件，並備份只存在本機的資料。

Published: 2026-06-03 | Updated: 2026-09-05

開發環境的空間分散在套件下載、建置輸出、SDK、本機資料庫和專案相依性樹中，部分可以重建，部分依賴鎖定檔、套件來源和工具鏈，還有一些是唯一的本機資料。點號目錄只說明它被隱藏，並不代表它是快取。

## 查看各工具的全域儲存

```
du -sh ~/.npm ~/.cargo ~/.cache/pip ~/Library/Caches/pip ~/.gradle 2>/dev/null | sort -h
```

這些只是預設位置。盡量用工具查詢實際路徑，例如 `npm config get cache`、`python -m pip cache dir` 和 `pnpm store path`。

- **npm：** 預設快取位於 `~/.npm`。先執行 [`npm cache verify`](https://docs.npmjs.com/cli/commands/npm-cache)。npm 快取可以自我修復，`npm cache clean --force` 只適合明確的空間回收或疑難排解
- **Cargo：** `~/.cargo` 不只有快取，還可能包含已安裝的二進位檔、設定、套件紀錄與登錄憑證。目前 Cargo 會定期清理未使用快取，手動處理時也應落到具體子目錄，整體刪除會把這些非快取內容一起帶走。詳見 [Cargo home](https://doc.rust-lang.org/cargo/guide/cargo-home.html)
- **pip：** 預設快取 wheel 和 HTTP 回應到 `~/Library/Caches/pip`。`python -m pip cache info` 顯示實際位置與大小，[`python -m pip cache purge`](https://pip.pypa.io/en/stable/cli/pip_cache/)用於清空
- **pnpm、yarn：** 可用 `pnpm store prune` 和 [`yarn cache clean`](https://yarnpkg.com/cli/cache/clean)處理未參照或快取套件。先確認版本，因為儲存配置和本機、全域行為會變化
- **Gradle、Maven：** `~/.gradle` 和 `~/.m2` 可能很大。Gradle 已有[定期快取清理](https://docs.gradle.org/current/userguide/directory_layout.html)，手動檢查前可以先停止守護行程，Maven 倉庫還可能含有本機建置或私有產物，整庫刪除會失去這些唯一副本

清掉這些內容可能觸發大型下載、原生程式碼重新編譯，甚至讓已經從套件來源消失的歷史版本無法建置。稱它為可重建之前，先確認鎖定檔、套件來源和工具鏈仍然可用。

## 找出散落的 node_modules

真正佔空間的往往不是一個全域快取，而是多個舊專案各自的 `node_modules`。每個目錄常有 200 至 500 MB，累積起來很可觀。

```
find ~/www ~/Projects -name node_modules -type d -prune -exec du -sh {} + 2>/dev/null
```

把範例根目錄換成實際專案位置。`-prune` 避免繼續進入相依性樹，`-exec` 能正確處理路徑中的空格和特殊字元。

專案能否重新安裝相依套件，取決於原始碼、鎖定檔、套件管理工具版本、套件來源的存取權和原生工具鏈是否齊全。保留這些必要檔案與工具後，使用與鎖定檔對應的指令，例如 `npm ci`。

## 這些內容不能當快取刪

專案原始碼、`package.json` 這類專案設定，以及 `package-lock.json`、`Cargo.lock` 等鎖定檔定義了建置，不是快取。全域共享儲存正在被安裝使用時也不能清理，否則可能損壞索引。先停止建置、安裝和相關守護行程。

## 共享儲存和專案相依性樹不同

pnpm 會在全域內容定址儲存中保留套件版本，再透過硬連結接入各專案的 `node_modules`，多個專案可以共享同一份磁碟內容。Cargo 和 Go 快取也常按版本或檢查碼儲存。

傳統 npm 安裝則會在每個專案中產生相依性樹。因此，刪除一個專案的 `node_modules` 與清理全域共享儲存，影響範圍完全不同。內容定址能去重和驗證，卻不能保證未來仍能從套件來源下載同一版本。

<figure class="blog-diagram">
  <img src="https://mole.fit/img/blog/content-addressed-store.webp" width="1360" height="454" loading="lazy" alt="左側一個共享全域儲存透過硬連結連接到多個專案，右側同一個函式庫被複製進每個專案的 node_modules，形成重複。">
  <figcaption>共享內容定址儲存和每個專案單獨產生的相依性樹，清理邊界不同。</figcaption>
</figure>

## 用地圖找目標，用套件管理工具清理

[Mole](https://mole.fit/tw/) 的「分析」頁可以找出哪個專案或儲存最大，套件管理工具自己的 verify、prune 和 clean 指令則理解索引與參照。先用地圖選目標，再由所屬工具執行清理。

## 安全的操作順序

比較容易複核的順序是：停止建置和守護行程，測量選定目錄，驗證套件儲存，保留原始碼與鎖定檔，再處理相依性樹。文件中的 prune 或 clean 指令通常比刪除整個點號目錄更了解參照關係，清空垃圾桶前，也可以用一個重要專案的完整建置確認輸入仍然齊全。

---

Canonical HTML page: https://mole.fit/tw/blog/how-to-clear-dev-caches-mac
Blog index for agents: https://mole.fit/tw/blog/llms.txt
Site index for agents: https://mole.fit/llms.txt
