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

一,package.json

  1. 在 Node.js 中,模塊是一個(gè)庫(kù)或框架,也是一個(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 - 包的版本號(hào);
    3. description - 包的描述;
    4. homepage - 包的官網(wǎng)URL;
    5. dependencies / devDependencies - 生產(chǎn)/開發(fā)環(huán)境依賴包列表。它們將會(huì)被安裝在 node_module 目錄下;
    6. peerDependencies 對(duì)等依賴 參見:https://nodejs.org/en/blog/npm/peer-dependencies/
  3. 如何更新/下載 package.json 里的依賴包

    1. npm install -save moduleName 命令

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

    2. npm install -save-dev moduleName 命令

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

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

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

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

二,package-lock.json

  1. package-lock.json 是在 npm install 時(shí)候生成的一份文件,用以記錄當(dāng)前狀態(tài)下實(shí)際安裝的各個(gè) npm package 的具體來源和版本號(hào)。package-lock.json 文件的作用鎖定安裝時(shí)的包的版本號(hào),并且需要上傳到 git,以保證其他人在 npm install 時(shí)大家的依賴能保證一致。
  2. 為什么需要把package-lock.json提交到gitlab
    1. package.json 文件只能鎖定大版本,也就是版本號(hào)的第一位,并不能鎖定后面的小版本,npm install 都是拉取的該大版本下的最新的版本,為了穩(wěn)定性考慮我們幾乎是不敢隨意升級(jí)依賴包的,這將導(dǎo)致多出來很多工作量,測(cè)試/適配等,所以 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會(huì)先從package.json文件中讀取所有dependencies信息,然后根據(jù)dependencies中的信息與node_modules中的模塊進(jìn)行對(duì)比,沒有的直接下載,已有的檢查更新,并生成package-lock.json。
    1. 下載和更新按照package.json 文件按照鎖定情況,更新到大版本的最新小版。
  2. 當(dāng)你的項(xiàng)目里既有package.json和package-lock.json時(shí),node會(huì)從package.json里面讀取模塊名稱,并從package-lock.json文件里找到對(duì)應(yīng)的版本號(hào),進(jìn)行下載或者更新。
    1. 這里的下載和更新是指按照package.json 文件指定版本下載,不會(huì)更新到大版本的最新小版。
    2. 正因?yàn)橛辛藀ackage-lock.json文件鎖定版本號(hào),所以當(dāng)你執(zhí)行npm install的時(shí)候,node不會(huì)自動(dòng)更新package.json文件中的模塊,必須用npm install packagename(自動(dòng)更新小版本號(hào))或者npm install packagename@x.x.x(指定版本號(hào))或者手動(dòng)更改package.json來進(jìn)行安裝才會(huì)更新,package-lock.json文件中的版本號(hào)也會(huì)隨著更新。
  3. 當(dāng)package.json與package-lock.json都不存在,執(zhí)行"npm install"時(shí),node會(huì)重新生成package-lock.json文件,然后把node_modules中的模塊信息全部記入package-lock.json文件,但不會(huì)生成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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容