Solve Node.js Packages Dependencies with npm shrinkwrap

之前有提過在nodejs的開發中,npm扮演著相當重要的角色,因 為一般常見的nodejs專案,都是大量依賴其他開發者所貢獻的程式,然後在其上堆疊並創造出出自己需要的新功能。npm的存在就提供所有的開發者可以清 楚的定義出不同套件之間的關聯與需求,也就是大家都很熟悉的package.json定義檔 。

不過雖然有npm幫眾開發者處理好許多套件相依的問題,不過還是有可能發生問題的情況:

我們的專案A需要B/C套件
A@1.0.0
├── B@1.0.0
└── C@0.5.0

B/C套件的相依
B@1.0.0
├── C@0.5.0
└── D@1.2.3 C@0.5.0

在我們的專案定義檔(package.json)中,我們可能會寫成這樣:

{
  "name": "A",
  "version": "1.0.0",
  "dependencies": {
    "B": "1.0.x",
    "C": "0.5.x"
  }
}

但是 如果B的其中一個相依的套件有了更動
B@1.0.1
├── C@0.5.2
└── D@1.2.4

這時候的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

Ferrari Lee

Read more posts by this author.

Subscribe to Ferrari != Ferrari

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!