清除開發者快取而不破壞建置
開發環境的空間分散在套件下載、建置輸出、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。npm 快取可以自我修復,npm cache clean --force只適合明確的空間回收或疑難排解 - Cargo:
~/.cargo不只有快取,還可能包含已安裝的二進位檔、設定、套件紀錄與登錄憑證。目前 Cargo 會定期清理未使用快取,手動處理時也應落到具體子目錄,整體刪除會把這些非快取內容一起帶走。詳見 Cargo home - pip: 預設快取 wheel 和 HTTP 回應到
~/Library/Caches/pip。python -m pip cache info顯示實際位置與大小,python -m pip cache purge用於清空 - pnpm、yarn: 可用
pnpm store prune和yarn cache clean處理未參照或快取套件。先確認版本,因為儲存配置和本機、全域行為會變化 - Gradle、Maven:
~/.gradle和~/.m2可能很大。Gradle 已有定期快取清理,手動檢查前可以先停止守護行程,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 與清理全域共享儲存,影響範圍完全不同。內容定址能去重和驗證,卻不能保證未來仍能從套件來源下載同一版本。
用地圖找目標,用套件管理工具清理
Mole 的「分析」頁可以找出哪個專案或儲存最大,套件管理工具自己的 verify、prune 和 clean 指令則理解索引與參照。先用地圖選目標,再由所屬工具執行清理。
安全的操作順序
比較容易複核的順序是:停止建置和守護行程,測量選定目錄,驗證套件儲存,保留原始碼與鎖定檔,再處理相依性樹。文件中的 prune 或 clean 指令通常比刪除整個點號目錄更了解參照關係,清空垃圾桶前,也可以用一個重要專案的完整建置確認輸入仍然齊全。