對npm包精準控制之npm-shrinkwrap.json與package-lock.json

npm-shrinkwrap.json

該文件是經過運行npm shrinkwrap命令產生的,在npm5以前(不包括5),主要是用來精準控制安裝指定版本的npm包。具體啥意思?node

在開發一個項目的時候,特別是多人協做,或者在不一樣設備中對同一個項目進行開發,可能會遇到這樣的問題,A同事經過npm install安裝了一些在某個版本下的npm包,過了一段日子,某個npm包內容功能更新了(更不幸的話還多是會破壞了本來一些功能的更新),B同事加入項目來了,他也須要在本身的設備上安裝項目資源,結果是,在A同事這邊功能正常的,但到B同事這邊卻異常了。這只是一種例子,還有更多相似的,相信不少開發者可能也會遇到過。git

那麼致使這種狀況發生的根本緣由是在於,同事間安裝的npm包版本不一致,可能功能也就不一致。github

可能會有人疑問,那我在package.json中精確寫死某個版本的npm包不就得了嗎? 不!你漏了一個很重要的信息,這也是package.json作不到的,就是你要安裝的這個npm包可能還須要依賴一些其餘包,這些其餘包的版本你也要控制好才能100%肯定一致npm

還有一個更加典型的例子,就是咱們在本地開發好的項目,一切正常,可是當須要在CI上進行打包發佈後,發現有bug了!oh shit—— 心裏不由感嘆了一下。 緣由也是跟上面同樣。json

那麼如何避免這種狀況的發生呢,就是要確保安裝的npm包版本一致,這時候,就是npm-shrinkwrap.json的做用了,簡單看一下長什麼樣子:post

這裏邊會記錄你項目所依賴的npm包的一些信息,如版本號,資源地址,依賴項等,換句話說,就是記錄你當前項目所造成的npm資源樹。.net

那記錄這些有什麼用呢? 咱們安裝npm包時,依據這些信息來安裝對應信息的npm包,以達到每一個人安裝的包是一致的目的。版本控制

注意code

  • 每次更新package.json或者node_modules時,如npm install新包,npm updatenpm uninstall等操做,爲保持協做人的資源一致,仍是要手動運行npm shrinkwrap更新npm-shrinkwrap.json文件的。
  • 並且記得加入到版本控制中,否則就沒意義了。
  • shrinkwrap計算時是根據當前依賴安裝的目錄結構生成的,若是你不能保證package.json文件定義的依賴與node_modules下已安裝的依賴是匹配、無冗餘的,建議在執行shrinkwrap命令前清理依賴並從新安裝(rm -rf node_modules && npm install)或精簡依賴(npm prune)。
  • 你們在查閱一些資料時,可能會看到以下描述:

默認狀況下,shrinkwrap只計算dependencies依賴,而不計算dev-dependencies,若是在生產環境也須要開發依賴或你的依賴分類不清晰,使用--dev參數生成shrinkwrap文件確保不會出問題。cdn

後來我嘗試過,就算不輸入--dev,仍是能夠把開發依賴生成到npm-shrinkwrap.json裏,估計當時描述的做者當時背景下,npm這個設置的確是那樣,只是到今天的迭代後,已經不正確了。

package-lock.json

在使用npm5後,你們可能都會發現,在項目裏會存在一個文件——package-lock.json,打開一看,emmm~~ 這不就是npm-shrinkwrap.json嘛,的確,還真的一摸同樣。

這是一個自動生成的文件,在咱們修改pacakge.json或者node_modules時就會自動產生或更新了。這個東西不只長得像npm-shrinkwrap.json,功能也跟它很像。

既然這樣,爲何要特地搞這麼一個新的文件呢。雖然功能十分十分地類似,可是仍是存在一些區別

npm-shrinkwrap.json 與 package-lock.json的區別與聯繫

從npm版本看

package-lock.json是npm5的新特性,也不向前兼容,若是npm版本是4或如下,那仍是使用npm-shrinkwrap.json

從npm處理機制來看

  1. 在一個項目裏,若是自己不存在這兩個文件,那麼在運行npm install時,會自動生成一個package-lock.json,或者在初始化一個項目npm init時,也會生成package-lock.json,安裝信息會依據該文件進行,而不是單純按照package.json,這兩個文件的優先級都比package.json
  2. 若是項目兩個文件都存在,那麼安裝的依賴是依據npm-shrinkwrap.json來的,而忽略package-lock.json
  3. 運行命令npm shrinkwrap後,若是項目裏不存在package-lock.json,那麼會新建一個npm-shrinkwrap.json文件,若是存在package-lock.json,那麼會把package-lock.json重命名爲npm-shrinkwrap.json

從文件更新來看

  1. npm-shrinkwrap.json只會在運行npm shrinkwrap纔會建立/更新
  2. package-lock.json會在修改pacakge.json或者node_modules時就會自動產生或更新了。

從發佈包來看

  1. package-lock.json不會在發佈包中出現,就算出現了,也會遭到npm的無視。
  2. npm-shrinkwrap.json能夠在發佈包中出現

疑惑

好吧,我在查閱資料的時候,總有一個不懂的地方,總會看到這麼一出描述

建議庫做者發佈包時不要包含npm-shrinkwrap.json,由於這會阻止最終用戶控制傳遞依賴性更新。

說句實話的,其實我仍是不太懂,爲啥不要發佈呢,這樣不就是恰好讓發佈出來的應用能保證不會因爲依賴別人的包更新了而致使出錯嗎? 懇請大神賜教賜教

本文參考

github.com/npm/cli/blo… ithelp.ithome.com.tw/articles/10… juejin.im/post/594384… blog.csdn.net/ligang25851…

相關文章
相關標籤/搜索