npm3 Non-determinism

在一些頁(yè)面的例子里是這么說(shuō)的:


如果你和你的開(kāi)發(fā)團(tuán)隊(duì)使用package.json肌似,也通過(guò)npm install命令添加pkgs(像大多數(shù)使用npm團(tuán)隊(duì)做的),很可能會(huì)遇到這種情況:你本地的node_modules目錄和你同事的node_modules目錄不同诉瓦,包括node_modules目錄在staging,testing或者生產(chǎn)服務(wù)上川队。

簡(jiǎn)單來(lái)說(shuō):npm3不是一個(gè)絕對(duì)的方式安裝依賴。
知道這個(gè)可能不太舒服睬澡,但是這篇文章我們會(huì)討論為什么會(huì)這樣固额,同時(shí)像你保證對(duì)你的應(yīng)用沒(méi)有影響,同時(shí)會(huì)告訴你如何創(chuàng)建一個(gè)單一的煞聪,一致的node_modules目錄斗躏。

例子:

讓我們回到幾個(gè)例子之前:


這個(gè)例子里,我們的應(yīng)用的package.json如下:

{
  "name": "example3",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "mod-a": "^1.0.0",
    "mod-c": "^1.0.0",
    "mod-d": "^1.0.0",
    "mod-e": "^1.0.0"
  }
}

npm install昔脯,我們?cè)诮K端里看到如下:


現(xiàn)在啄糙,假設(shè)我們團(tuán)隊(duì)里的開(kāi)發(fā)者決定完成一個(gè)特性需要將模塊A升級(jí)到v2.0,并且依賴于模塊B v2.0,而不是之前的模塊B v1.0

開(kāi)發(fā)者使用npm install命令來(lái)安裝新版本的Module A云稚,并且保存到package.json:

npm install mod-a@2 --save

終端輸出如下:


現(xiàn)在看起來(lái)是這樣的:


假設(shè)開(kāi)發(fā)者完成了特性需要ModuleA的新版本并且推送應(yīng)用到測(cè)試服務(wù)上運(yùn)行了npm install在新的package.json

{
  "name": "example3",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "mod-a": "^2.0.0",
    "mod-c": "^1.0.0",
    "mod-d": "^1.0.0",
    "mod-e": "^1.0.0"
  }
}

測(cè)試服務(wù)日志如下:


圖形化如下:


什么鬼隧饼?這個(gè)目錄結(jié)構(gòu)和我們本地機(jī)器上的目錄結(jié)構(gòu)完全不一樣。咋的了這是静陈?

記籽嘌恪:安裝順序很重要

當(dāng)開(kāi)發(fā)者使用npm install更新Module A,Module A v2.0是最后一個(gè)安裝的。因?yàn)殚_(kāi)發(fā)者是一開(kāi)始就在這個(gè)項(xiàng)目上使用npm install完成的窿给,所有在package.json列出的的模塊已經(jīng)安裝在node_module目錄了贵白。然后Module A v2.0 被安裝率拒。
接著崩泡,Module B v1.0是頂級(jí)依賴因?yàn)镸odule A v1.0,然后因?yàn)镸odule E v1.0而讓Module B v1.0仍然在頂級(jí)依賴?yán)镡颉R驗(yàn)镸odule B仍然占著頂級(jí)角撞,導(dǎo)致其他版本的Module B不能在這呛伴,因此,ModuleBv2.0仍然是Module C和D的嵌套依賴谒所,同樣也是Module A2.0的嵌套依賴热康。

讓我們想一下測(cè)試服務(wù)器上發(fā)生了什么。項(xiàng)目被推送到一個(gè)新目錄里劣领。比如:預(yù)先不存在node_modules目錄姐军,然后npm install執(zhí)行,大概通過(guò)部署腳本尖淘,從package.json里安裝依賴奕锌。

package.json現(xiàn)在已經(jīng)有了模塊A v2.0在里面,并且是按字母排序的(npm install命令強(qiáng)制的)村生,現(xiàn)在是第一個(gè)安裝的惊暴,而不是最后一個(gè)。
當(dāng)模塊A是在一個(gè)干凈的node_modules里第一個(gè)安裝的趁桃,它的依賴當(dāng)然也是第一個(gè)候選在頂級(jí)位置辽话。因此,Module B v2.0安裝在node_modules目錄的頂級(jí)卫病。

現(xiàn)在油啤,當(dāng)是時(shí)候安裝模塊E v1.0的時(shí)候,它的依賴模塊B v1.0,占不了頂級(jí)node_modules目錄了忽肛,自然就在Module E目錄下了村砂。

不同的依賴樹(shù)結(jié)構(gòu)會(huì)對(duì)應(yīng)用有影響嗎?

不會(huì)屹逛!即使樹(shù)結(jié)構(gòu)不同础废,足夠的安裝和所有依賴項(xiàng)指向他們所有的依賴關(guān)系,等等。仍然擁有你所需要的一切,只是碰巧在不同的配置罕模。

想要node_modules目錄保持一致评腺,咋整?

npm install命令淑掌,當(dāng)使用唯一的package.json安裝依賴蒿讥,產(chǎn)生的樹(shù)結(jié)構(gòu)是一樣的。因?yàn)閬?lái)自于package.json的安裝順序使用是一樣的抛腕。相同的安裝順序就能得到相同的樹(shù)結(jié)構(gòu)芋绸。

然后在改變package.json的時(shí)候可以放心的刪除掉node_modules,然后重新運(yùn)行npm install担敌,就能保證樹(shù)結(jié)構(gòu)是一致的咯摔敛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市全封,隨后出現(xiàn)的幾起案子马昙,更是在濱河造成了極大的恐慌桃犬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件行楞,死亡現(xiàn)場(chǎng)離奇詭異攒暇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)子房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門形用,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人证杭,你說(shuō)我怎么就攤上這事尾序。” “怎么了躯砰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵每币,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我琢歇,道長(zhǎng)兰怠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任李茫,我火速辦了婚禮揭保,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魄宏。我一直安慰自己秸侣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布宠互。 她就那樣靜靜地躺著味榛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪予跌。 梳的紋絲不亂的頭發(fā)上搏色,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音券册,去河邊找鬼频轿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烁焙,可吹牛的內(nèi)容都是我干的航邢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼骄蝇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膳殷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乞榨,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秽之,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吃既,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體考榨,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鹦倚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了河质。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡震叙,死狀恐怖掀鹅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媒楼,我是刑警寧澤乐尊,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站划址,受9級(jí)特大地震影響扔嵌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夺颤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一痢缎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧世澜,春花似錦独旷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至封恰,卻和暖如春咱台,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俭驮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工回溺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人混萝。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓遗遵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逸嘀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子车要,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容