慘烈的 npm@5

npm@5 是一個讓人興奮的全新 npm 版本。

它引入了與 yarn 類似的鎖機制、明顯提昇的安裝速度,以及針對 git repo 進行語意版本控制等方方面面。

然而,就目前來說,這同時也是個充滿 bug 的地雷坑。我已經被 workaround 的 workaround 中的雷炸飛了好幾次。

分享一下這邊踩到的雷(基於 npm@5.3),以資娛樂:

git 包無法全域安裝

透過 git 安裝的套件,或任何依賴 git 套件的套件,都無法用 root 使用者來安裝。

換句話任何 git 包都無法安裝在全域 (-g)。

雖然安裝在全域並不值得推薦,但現狀有大量的包需要共通使用,或是某些系統維護腳本就是需要 root 權限。這時安裝在全域還是比較方便。

順便一提,用 sudo npx 執行 git repo 也必然失敗。

package-lock.json 鎖定無效

npm install 會產生 package-lock.json 檔案,這個檔案可以用來鎖定版本。設計應該是這樣。

但是現階段的現實是,即使 package.json 沒改動,npm install 執行後,package-lock.json 內容一樣會改變。結果根本無法鎖定任何東西。

無參數 npm install 造成隨機 package-lock.json 變化

node_modules 不存在時執行 npm install,會在某些情況下導致 package-lock.json 改變。而且行為不穩定。在我的案例中每次都會變,有時變 A 模式有時變 B 模式。

結果難以對 package-lock.json 進行版本管理。

無參數 npm install 造成 node_modules 資料夾損毀

續前項。

當前項狀況發生時,如果用戶嘗試使用 git checkout -- . 之類的手段將被亂改動的 package-lock.json 復原,然後又在 node_modules 資料夾存在的狀況下再次執行 npm install,則這次 package-lock.json 不會改變,但 node_modules 結構會改變——並變為無效。

隨後執行 node 你的程式.js 時就會發現程式因找不到外部套件而執行失敗。


目前官網 issue 區仍處於慶典狀態,跑來報 bug 的同學之出現速度是以小時為單位來計算,樓長得比竹筍還快。

建議需要 lock 功能的朋友暫時退回 yarn。我猜這還有得修,而且 package-lock.json 的設計說不定會被再改過,還是先等他三個月再說。