你有沒有遇過這樣的狀況?為了節省電腦空間,把 pnpm 的 store 設定在外接硬碟,結果某天沒帶硬碟出門,或是想換個位置存,pnpm 就開始噴錯說找不到目錄?甚至把硬碟插回去也怪怪的?
這其實跟 pnpm 獨特的運作原理有關。今天我們就來聊聊 pnpm 的「倉庫」機制,以及當它「失聯」時該如何救回來!
pnpm 到底是怎麼省空間的?
在開始修復之前,我們先快速複習一下 pnpm 的省空間魔法。
不同於 npm 會在每個專案的 node_modules 裡都複製一份完整的套件,pnpm 使用的是 Content-addressable store (全域倉庫) 與 Hard Links (硬連結)。
pnpm 運作方式就是所有的套件檔案其實都只會存在你電腦裡的 某個「大倉庫」,你的專案目錄只是透過連結指向這個倉庫而已。這樣不僅節省硬碟空間,安裝速度也快得驚人。
| 項目 | pnpm | npm |
|---|---|---|
| 儲存方式 | 全域倉庫 (Store) + 硬連結 | 每個專案獨立複製 |
| 空間佔用 | 極低 (同版本只存一份) | 高 (重複複製) |
| 安裝速度 | 快 (建立連結即可) | 慢 (需要解壓縮與寫入) |
為什麼外接硬碟會讓 pnpm 噴錯?
當你為了省本機 SSD 空間,把 pnpm store 設在外接硬碟時,潛在的坑就出現了:
| 狀況 | 說明 |
|---|---|
| 路徑失效 | 沒插硬碟時,pnpm 找不到原本設定的 store-dir,安裝時會直接報錯退出。 |
| 硬連結崩潰 | 因為硬連結(Hard Link)不能跨分割區(Partition),如果你的專案在 A 硬碟,倉庫在 B 硬碟,pnpm 會被迫改用複製的方式,這反而失去了原本的優勢,甚至可能因為快取路徑亂掉而導致執行錯誤。 |
遇到這種情況,我們需要手動來「校正回歸」一下。
解決方案一:校正回歸,重新設定 Store 路徑
如果你決定更換 store 的位置,最直接的方法就是告訴 pnpm 新的倉庫在哪裡。你可以使用以下指令:
pnpm config set store-dir <你的新目錄路徑>
例如將 pnpm store 設定使用者家目錄下的 ~/.pnpm-store:
pnpm config set store-dir ~/.pnpm-store
如果你不確定目前的 store 設定在哪,可以先查詢:
pnpm store path
設定完成後,pnpm 就會知道以後要往哪裡去抓套件了。
解決方案二:砍掉重練,重新建立連結
有時候改完路徑,專案還是會有一些舊的殘留錯誤。這時候「砍掉重練」通常是最有效的藥方:
| 步驟 | 說明 |
|---|---|
| 1 | 刪除專案中的 node_modules 資料夾。 |
| 2 | 刪除 pnpm-lock.yaml(如果是因為路徑引起的奇怪錯誤,建議鎖檔也重產)。 |
| 3 | 執行 pnpm install 重新建立連結。 |
這會強迫 pnpm 根據你最新的配置,重新從 store 中拉出正確的連結到你的專案裡。
如何分配才最順?
如果你常在不同環境切換,或是擔心外接硬碟不穩定,最理想的配置是:將 pnpm store 放在本機 SSD,而專案代碼可以放外接硬碟。
為什麼?因為 store 通常不會變動得太頻繁,且體積雖然有,但分散在各專案的總和其實比 npm 小很多。保持倉庫在穩定的本機路徑(例如 macOS 預設的 ~/Library/pnpm/store),能讓你就算沒帶外接硬碟,也能在其他地方順利初始化新專案。
這種 Stateless(無狀態)的開發概念,能讓你的開發環境更具彈性!
結論:保持 Store 的穩定性就是省麻煩
管理 pnpm store 的重點在於「穩定」二字。如果你遇到了路徑問題,可以這樣做:
| 步驟 | 說明 |
|---|---|
| 1 | 先檢查並更換 store-dir 設定。 |
| 2 | 清理一下舊的套件:pnpm store prune(這可以幫你清除沒人在用的套件檔案,幫硬碟瘦身) |
| 3 | 重新安裝套件 pnpm install |
希望這篇文章能幫大家跳出 pnpm 路徑的坑,享受極速開發的樂趣!