之前有提過在 nodejs 的開發中,npm扮演著相當重要的角色,因 為一般常見的 nodejs 專案,都是大量依賴其他開發者所貢獻的程式,然後在其上堆疊並創造出出自己需要的新功能。npm 的存在就提供所有的開發者可以清 楚的定義出不同套件之間的關聯與需求,也就是大家都很熟悉的package.json定義檔 。
不過雖然有 npm 幫眾開發者處理好許多套件相依的問題,不過還是有可能發生問題的情況:
我們的專案 A 需要 B/C 套件
[email protected]
├── [email protected]
└── [email protected]
B/C 套件的相依
[email protected]
├── [email protected]
└── [email protected] [email protected]
在我們的專案定義檔(package.json)中,我們可能會寫成這樣:
{
"name": "A",
"version": "1.0.0",
"dependencies": {
"B": "1.0.x",
"C": "0.5.x"
}
}
但是 如果 B 的其中一個相依的套件有了更動
[email protected]
├── [email protected]
└── [email protected]
這時候的npm install就會把 C & D 都升版,而當這種情況變多之後,可能會產生意料之外的問題,這時候就會讓你的程式變得很難控制,因為你無法知道你的專案所需要的函式厙會不會突然來給你升個版號,即便是個小升級(ex: B: 1.0.0 -> 1.0.1 && C: 0.5.0 -> 0.5.2 && D: 1.2.3 -> 1.2.4)都有可能 ,在測試期你可能不會覺得怎樣,但是如果是要推上線的產品,任何與測試期的不一致都有可能造成問題(其實就算一致也可能會有問題 XDD),所以 nodejs 開發團隊就在新版的 npm 中加入了 - Shrinkwrap
Managing Node.js Dependencies with Shrinkwrap
其實也不是什麼神奇的東西 :p 就是把所有的套件版號都明確的列出來,以範例而言執行npm shrinkwrap就會變成:
{
"name": "A",
"dependencies": {
"B": {
"version": "1.0.0",
"dependencies: {
"C": { "version": "0.5.0" }
"D": { "version": "1.2.3" }
}
},
"C": {
"version": 0.5.0",
}
}
}
然後會產生一個 npm-shrinkwrap.json 的定義檔,把專案內所有的套件都明確的定義好,如此一來你就不需要擔心意料之外的版本變動影響到自己的程式。 這部份可以參考一下有強者的說明文&上方列出的 nodejs 官網的文章,想親自嘗試的可以直接去抓 npm > 1.1.2 之後的版本就可以嘗鮮了 :p