該文件是經過運行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 update
, npm uninstall
等操做,爲保持協做人的資源一致,仍是要手動運行npm shrinkwrap
更新npm-shrinkwrap.json
文件的。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這個設置的確是那樣,只是到今天的迭代後,已經不正確了。
在使用npm5後,你們可能都會發現,在項目裏會存在一個文件——package-lock.json
,打開一看,emmm~~ 這不就是npm-shrinkwrap.json
嘛,的確,還真的一摸同樣。
這是一個自動生成的文件,在咱們修改pacakge.json或者node_modules時就會自動產生或更新了。這個東西不只長得像npm-shrinkwrap.json
,功能也跟它很像。
既然這樣,爲何要特地搞這麼一個新的文件呢。雖然功能十分十分地類似,可是仍是存在一些區別
package-lock.json
是npm5的新特性,也不向前兼容,若是npm版本是4或如下,那仍是使用npm-shrinkwrap.json
吧
npm install
時,會自動生成一個package-lock.json
,或者在初始化一個項目npm init
時,也會生成package-lock.json
,安裝信息會依據該文件進行,而不是單純按照package.json
,這兩個文件的優先級都比package.json
高npm-shrinkwrap.json
來的,而忽略package-lock.json
npm shrinkwrap
後,若是項目裏不存在package-lock.json
,那麼會新建一個npm-shrinkwrap.json
文件,若是存在package-lock.json
,那麼會把package-lock.json
重命名爲npm-shrinkwrap.json
npm-shrinkwrap.json
只會在運行npm shrinkwrap
纔會建立/更新package-lock.json
會在修改pacakge.json或者node_modules時就會自動產生或更新了。package-lock.json
不會在發佈包中出現,就算出現了,也會遭到npm的無視。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…