npm 配置文件package.json/package-lock.json 的使用和版本控制

一荐健,package.json

  1. 在 Node.js 中险耀,模塊是一個(gè)庫或框架音半,也是一個(gè) Node.js 項(xiàng)目则拷。Node.js 項(xiàng)目遵循模塊化的架構(gòu)贡蓖,當(dāng)我們創(chuàng)建了一個(gè) Node.js 項(xiàng)目,意味著創(chuàng)建了一個(gè)模塊煌茬,這個(gè)模塊的描述文件斥铺,被稱為 package.json。

  2. package.json 屬性說明:

    1. name - 包名宣旱;
    2. version - 包的版本號仅父;
    3. description - 包的描述;
    4. homepage - 包的官網(wǎng)URL浑吟;
    5. dependencies / devDependencies - 生產(chǎn)/開發(fā)環(huán)境依賴包列表笙纤。它們將會被安裝在 node_module 目錄下;
    6. peerDependencies 對等依賴 參見:https://nodejs.org/en/blog/npm/peer-dependencies/
  3. 如何更新/下載 package.json 里的依賴包

    1. npm install -save moduleName 命令

      1. 安裝模塊到項(xiàng)目node_modules目錄下组力。
      2. 會將模塊依賴寫入dependencies 節(jié)點(diǎn)省容。
      3. 運(yùn)行 npm install 初始化項(xiàng)目時(shí),會將模塊下載到項(xiàng)目目錄下燎字。
      4. 運(yùn)行npm install --production或者注明NODE_ENV變量值為production時(shí)腥椒,自動(dòng)下載模塊到node_modules目錄中。

    2. npm install -save-dev moduleName 命令

      1. 安裝模塊到項(xiàng)目node_modules目錄下候衍。
      2. 會將模塊依賴寫入devDependencies 節(jié)點(diǎn)笼蛛。
      3. 運(yùn)行 npm install 初始化項(xiàng)目時(shí),會將模塊下載到項(xiàng)目目錄下蛉鹿。
      4. 運(yùn)行npm install --production或者注明NODE_ENV變量值為production時(shí)滨砍,不會自動(dòng)下載模塊到node_modules目錄中。

    3. 拉取單個(gè)依賴最好后面加上你需要的版本號妖异,如:npm install -save @angular/router@7.2.16

  4. 是否允許你的依賴自動(dòng)更新

    1. '~'(波浪符號):他會更新到當(dāng)前minor version(也就是中間的那位數(shù)字)中最新的版本惋戏。放到我們的例子中就是:"exif-js": "~2.3.0",這個(gè)庫會去匹配更新到2.3.x的最新版本他膳,如果出了一個(gè)新的版本為2.4.0响逢,則不會自動(dòng)升級。波浪符號是曾經(jīng)npm安裝時(shí)候的默認(rèn)符號棕孙,現(xiàn)在已經(jīng)變?yōu)榱瞬迦敕枴?/li>
    2. '^'(插入符號): 這個(gè)符號就顯得非常的靈活了舔亭,他將會把當(dāng)前庫的版本更新到當(dāng)前major version(也就是第一位數(shù)字)中最新的版本。放到我們的例子中就是:"vue": "^2.2.2", 這個(gè)庫會去匹配2.x.x中最新的版本蟀俊,但是他不會自動(dòng)更新到3.0.0分歇。
    3. 不加 ^和~,表示不更新欧漱,是精確版本。

二葬燎,package-lock.json

  1. package-lock.json 是在 npm install 時(shí)候生成的一份文件误甚,用以記錄當(dāng)前狀態(tài)下實(shí)際安裝的各個(gè) npm package 的具體來源和版本號缚甩。package-lock.json 文件的作用鎖定安裝時(shí)的包的版本號,并且需要上傳到 git窑邦,以保證其他人在 npm install 時(shí)大家的依賴能保證一致擅威。
  2. 為什么需要把package-lock.json提交到gitlab
    1. package.json 文件只能鎖定大版本,也就是版本號的第一位冈钦,并不能鎖定后面的小版本郊丛,npm install 都是拉取的該大版本下的最新的版本,為了穩(wěn)定性考慮我們幾乎是不敢隨意升級依賴包的瞧筛,這將導(dǎo)致多出來很多工作量厉熟,測試/適配等,所以 package-lock.json 文件出來了较幌,當(dāng)你每次安裝一個(gè)依賴的時(shí)候就鎖定在你安裝的這個(gè)版本揍瑟。
    2. package-lock.json記錄的是依賴樹,記錄了依賴模塊之間的完整依賴關(guān)系乍炉。package.json記錄的是依賴項(xiàng)绢片,不能鎖定依賴的依賴。

三岛琼,執(zhí)行npm i (npm install)的時(shí)候底循,是如何執(zhí)行package.json和package-lock.json的?

  1. 當(dāng)你的項(xiàng)目里只有package.json時(shí)槐瑞,node會先從package.json文件中讀取所有dependencies信息熙涤,然后根據(jù)dependencies中的信息與node_modules中的模塊進(jìn)行對比,沒有的直接下載随珠,已有的檢查更新灭袁,并生成package-lock.json。
    1. 下載和更新按照package.json 文件按照鎖定情況窗看,更新到大版本的最新小版茸歧。
  2. 當(dāng)你的項(xiàng)目里既有package.json和package-lock.json時(shí),node會從package.json里面讀取模塊名稱显沈,并從package-lock.json文件里找到對應(yīng)的版本號软瞎,進(jìn)行下載或者更新。
    1. 這里的下載和更新是指按照package.json 文件指定版本下載拉讯,不會更新到大版本的最新小版涤浇。
    2. 正因?yàn)橛辛藀ackage-lock.json文件鎖定版本號,所以當(dāng)你執(zhí)行npm install的時(shí)候魔慷,node不會自動(dòng)更新package.json文件中的模塊只锭,必須用npm install packagename(自動(dòng)更新小版本號)或者npm install packagename@x.x.x(指定版本號)或者手動(dòng)更改package.json來進(jìn)行安裝才會更新,package-lock.json文件中的版本號也會隨著更新院尔。
  3. 當(dāng)package.json與package-lock.json都不存在蜻展,執(zhí)行"npm install"時(shí)喉誊,node會重新生成package-lock.json文件,然后把node_modules中的模塊信息全部記入package-lock.json文件纵顾,但不會生成package.json文件伍茄,此時(shí),你可以通過"npm init --yes"來生成package.json文件施逾。

四敷矫,版本控制

  1. 當(dāng)多人同時(shí)修改package-lock.json的時(shí)候,有可能出現(xiàn)沖突汉额,為了避免這種沖突曹仗,在我們執(zhí)行npm install命令時(shí),先拉取一下遠(yuǎn)程分支闷愤。
  2. 當(dāng)出現(xiàn)沖突時(shí)整葡,我們需要怎么解決?
    1. 如果沖突較少讥脐,建議手動(dòng)解決遭居。
    2. 如果沖突較多,可以通過手動(dòng)修復(fù)任何package.json沖突然后npm install [--package-lock-only]重新運(yùn)行來解決旬渠。參見:https://docs.npmjs.com/files/package-locks#resolving-lockfile-conflicts
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俱萍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子告丢,更是在濱河造成了極大的恐慌枪蘑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖免,死亡現(xiàn)場離奇詭異岳颇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)颅湘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門话侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闯参,你說我怎么就攤上這事瞻鹏。” “怎么了鹿寨?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵新博,是天一觀的道長。 經(jīng)常有香客問我脚草,道長赫悄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮涩蜘,結(jié)果婚禮上嚼贡,老公的妹妹穿的比我還像新娘。我一直安慰自己同诫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布樟澜。 她就那樣靜靜地躺著误窖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秩贰。 梳的紋絲不亂的頭發(fā)上霹俺,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音毒费,去河邊找鬼丙唧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛觅玻,可吹牛的內(nèi)容都是我干的想际。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼溪厘,長吁一口氣:“原來是場噩夢啊……” “哼胡本!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畸悬,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侧甫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蹋宦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體披粟,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年冷冗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了守屉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贾惦,死狀恐怖胸梆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情须板,我是刑警寧澤碰镜,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站习瑰,受9級特大地震影響绪颖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一柠横、第九天 我趴在偏房一處隱蔽的房頂上張望窃款。 院中可真熱鬧,春花似錦牍氛、人聲如沸晨继。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽紊扬。三九已至,卻和暖如春唉擂,著一層夾襖步出監(jiān)牢的瞬間餐屎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工玩祟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腹缩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓空扎,卻偏偏與公主長得像藏鹊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子勺卢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354