那些年使用npm進行依賴管理所踩的坑

那些年使用npm進行依賴管理所踩的坑

廢話

公司的項目用上了node來作先後端分離,相應的天然離不開使用npm來對依賴的第三方包進行管理。node

npm使用的語義化版本號管理想法很好,使用 npm install --save 安裝依賴包時,自動加上的 ^x.x.x 的版本號,看上去彷佛也頗有道理。npm

然而現實老是那麼殘酷,在經歷了屢次:在開發環境還跑的好好的項目,提測和上線時就掛了的狀況後(此處省略一萬字),
我終於意識到,版本號仍是固定的好啊!!!json

固然,依賴包的版本號應該怎麼固定,仍是有講究的。
去掉 ^x.x.x 前面的 ^ 使用一個固定的版本當然能夠,但經過 npm shrinkwrap 來固定,我以爲更加合適。後端

使用 npm-shrinkwrap

關於 npm-shrinkwrap 的介紹就很少說了,網上一搜一大堆。
反正就是生成一個版本信息固定的 npm-shrinkwrap.json 文件,而後 npm 在安裝依賴包的時候會首先參考 npm-shrinkwrap.json 文件的設置。服務器

本覺得萬事ok,沒想到卻在生成 npm-shrinkwrap.json 文件的時候踩了坑……前後端分離

問題

項目裏面有 dependencies 包 T,T 又 dependencies 包 C。然而在服務器上安裝好,運行的時候卻恰恰提示少了 C。
因而打開 npm-shrinkwrap.json 一看,裏面的 T 依賴的 C 不見了!WTF!code

通過一番排查,真想終於水落石出。原來項目有 devDependencies C。
開發的時候 npm insatll,T 裏面的 C 就被省略掉了。
本來貼心的處理,卻在 npm-shrinkwrap 成了一個大坑,由於 npm-shrinkwrap 默認是根據當前已安裝的 dependencies 的目錄結構來生成的。ci

解決

知道了問題的緣由,解決起來天然就很輕鬆了。
咱們在須要 npm-shrinkwrap 的時候:開發

方法1:清空 node_modules ,而後 npm install --production ,而後再 npm shrinkwrapio

方法2:npm prune --production ,而後再 npm shrinkwrap --dev

後話

npm 使用的版本爲 v2。 v3 彷佛由於會去計算依賴,沒有此問題了。
另外,一個心得是,對依賴的管理,要使用 npm 提供的方法來管理。
好比,我想去掉已安裝的 devDependencies 包,應該使用 npm prune --production 而不是本身手動的使用 npm uninstall

相關文章
相關標籤/搜索