npm package-lock.json

2021-10-29 10:52 更新

描述

package-lock.json對(duì)于任何 npm 修改node_modules樹(shù)或package.json.?它描述了生成的確切樹(shù),以便后續(xù)安裝能夠生成相同的樹(shù),而不管中間依賴(lài)項(xiàng)更新如何。

此文件旨在提交到源存儲(chǔ)庫(kù)中,并用于多種目的:

  • 描述依賴(lài)樹(shù)的單一表示,以便保證團(tuán)隊(duì)成員、部署和持續(xù)集成安裝完全相同的依賴(lài)關(guān)系。
  • 為用戶(hù)“時(shí)間旅行”到以前的狀態(tài)提供便利,?node_modules而無(wú)需提交目錄本身。
  • 通過(guò)可讀的源代碼控制差異提高樹(shù)更改的可見(jiàn)性。
  • 通過(guò)允許 npm 跳過(guò)先前安裝的包的重復(fù)元數(shù)據(jù)解析來(lái)優(yōu)化安裝過(guò)程。
  • 從 npm v7 開(kāi)始,鎖文件包含足夠的信息來(lái)獲得包樹(shù)的完整圖片,減少讀取package.json?文件的需要,并允許顯著的性能改進(jìn)。

package-lock.json?對(duì)比?npm-shrinkwrap.json

這兩個(gè)文件具有相同的格式,并且在項(xiàng)目的根目錄中執(zhí)行類(lèi)似的功能。

不同的是package-lock.json不能發(fā)布,如果在根項(xiàng)目以外的任何地方發(fā)現(xiàn)都會(huì)被忽略。

相比之下,npm-shrinkwrap.json允許發(fā)布,并從遇到的點(diǎn)定義依賴(lài)樹(shù)。除非部署 CLI 工具或以其他方式使用發(fā)布過(guò)程來(lái)生成生產(chǎn)包,否則不建議這樣做。

如果package-lock.jsonnpm-shrinkwrap.json都存在于項(xiàng)目的根目錄中,npm-shrinkwrap.json則將優(yōu)先并被?package-lock.json忽略。

隱藏的鎖文件

為了避免node_modules重復(fù)處理文件夾,從 v7 開(kāi)始,npm 使用存在于?node_modules/.package-lock.json.?這包含有關(guān)樹(shù)的信息,node_modules如果滿(mǎn)足以下條件,則用于代替讀取整個(gè)層次結(jié)構(gòu):

它引用的所有包文件夾都存在于node_modules層次結(jié)構(gòu)中。node_modules層次結(jié)構(gòu)中不存在未在鎖定文件中列出的包文件夾。文件的修改時(shí)間至少與其引用的所有包文件夾一樣近。也就是說(shuō),隱藏的鎖文件只有在作為包樹(shù)的最新更新的一部分創(chuàng)建時(shí)才相關(guān)。如果另一個(gè) CLI 以任何方式改變樹(shù),這將被檢測(cè)到,隱藏的鎖文件將被忽略。

注意,它是可以手動(dòng)改變內(nèi)容在這樣一種方式,包文件夾的修改的時(shí)間是不受影響的封裝的。例如,如果您將文件添加到node_modules/foo/lib/bar.js,則修改時(shí)間node_modules/foo不會(huì)反映此更改。如果您在 中手動(dòng)編輯文件node_modules,通常最好刪除 中的文件node_modules/.package-lock.json。

由于較舊的 npm 版本會(huì)忽略隱藏的鎖文件,因此它不包含“普通”鎖文件中存在的向后兼容性可供性。也就是說(shuō),它是lockfileVersion: 3,而不是?lockfileVersion: 2。

處理舊的鎖文件

當(dāng) npm 在包安裝過(guò)程中從 npm v6 或之前檢測(cè)到鎖文件時(shí),它會(huì)自動(dòng)更新以從node_modules樹(shù)或(在空node_modules樹(shù)或非常舊的鎖文件格式的情況下?)npm 注冊(cè)表中獲取丟失的信息。

文件格式

name

這是一個(gè)包鎖的包的名稱(chēng)。這將匹配package.json.

version

這是一個(gè)包鎖的包的版本。這將匹配package.json.

lockfileVersion

一個(gè)整數(shù)版本,從1這個(gè)文檔的版本號(hào)開(kāi)始,在生成 this 時(shí)使用了它的語(yǔ)義?package-lock.json。

請(qǐng)注意,npm v7 中的文件格式發(fā)生了重大變化,以跟蹤原本需要查看node_modulesnpm 注冊(cè)表的信息。npm v7 生成的鎖文件將包含?lockfileVersion: 2.

未提供版本:來(lái)自 npm v5 之前的 npm 版本的“古老”收縮包裝文件。1:npm v5 和 v6 使用的鎖文件版本。2:npm v7 使用的鎖文件版本,向后兼容 v1 鎖文件。3:npm v7 使用的鎖文件版本,沒(méi)有向后兼容性可供性。這用于隱藏的鎖文件?node_modules/.package-lock.json,一旦不再支持 npm v6,很可能會(huì)在 npm 的未來(lái)版本中使用。npm 將始終嘗試從鎖定文件中獲取它可以獲取的任何數(shù)據(jù),即使它不是它旨在支持的版本。

packages

這是一個(gè)將包位置映射到包含有關(guān)該包的信息的對(duì)象的對(duì)象。

根項(xiàng)目通常以 鍵列出"",所有其他包都以它們從根項(xiàng)目文件夾的相對(duì)路徑列出。

包描述符具有以下字段:

  • 版本:找到的版本?package.json
  • 已解析:實(shí)際解析包的位置。對(duì)于從注冊(cè)表獲取的包,這將是一個(gè)指向 tarball 的 url。對(duì)于 git 依賴(lài)項(xiàng),這將是帶有 commit sha 的完整 git url。在鏈接依賴(lài)的情況下,這將是鏈接目標(biāo)的位置。
  • 完整性:?在此位置解包的工件的sha512sha1?標(biāo)準(zhǔn)子資源完整性字符串。
  • 鏈接:一個(gè)標(biāo)志,表明這是一個(gè)符號(hào)鏈接。如果存在,則不指定其他字段,因?yàn)殒溄幽繕?biāo)也將包含在鎖定文件中。
  • dev, optional, devOptional:如果包嚴(yán)格地是devDependencies樹(shù)的一部分,則為?dev真。如果它嚴(yán)格是optionalDependencies樹(shù)的一部分,optional則將被設(shè)置。如果它既是一個(gè)dev依賴(lài)性和一個(gè)optional非開(kāi)發(fā)依賴(lài)的相關(guān)性,然后devOptional將被設(shè)置。(optional依賴(lài)項(xiàng)的dev依賴(lài)項(xiàng)將同時(shí)設(shè)置devoptional設(shè)置。)
  • inBundle:指示包是捆綁依賴(lài)項(xiàng)的標(biāo)志。
  • hasInstallScript:一個(gè)標(biāo)志,以表明該封裝具有preinstall,?installpostinstall腳本。
  • hasShrinkwrap:一個(gè)標(biāo)志,表明包有一個(gè)?npm-shrinkwrap.json文件。
  • bin、license、engines、dependencies、optionalDependencies:來(lái)自的字段?package.json

依賴(lài)

用于支持使用lockfileVersion: 1.?這是包名到依賴(lài)對(duì)象的映射。因?yàn)閷?duì)象結(jié)構(gòu)是嚴(yán)格分層的,符號(hào)鏈接依賴(lài)在某些情況下很難表示。

如果某個(gè)packages部分存在,npm v7 會(huì)完全忽略該部分,但會(huì)使其保持最新?tīng)顟B(tài)以支持在 npm v6 和 npm v7 之間切換。

依賴(lài)對(duì)象具有以下字段:

  • version:根據(jù)包的性質(zhì)而變化的說(shuō)明符,可用于獲取它的新副本。
    • 捆綁依賴(lài)項(xiàng):無(wú)論來(lái)源如何,這是一個(gè)純粹用于提供信息目的的版本號(hào)。
    • 注冊(cè)表源:這是一個(gè)版本號(hào)。(例如,1.2.3
    • git 來(lái)源:這是一個(gè) git 說(shuō)明符,具有已解決的 committish。(例如,?git+https://example.com/foo/bar#115311855adb0789a0466714ed48a1499ffea97e
    • http tarball 來(lái)源:這是 tarball 的 URL。(例如,?https://example.com/example-1.3.0.tgz
    • 本地 tarball 源:這是 tarball 的文件 URL。(例如?file:///opt/storage/example-1.3.0.tgz
    • 本地鏈接源:這是鏈接的文件 URL。(例如?file:libs/our-module
  • 完整性:?在此位置解包的工件的sha512sha1?標(biāo)準(zhǔn)子資源完整性字符串。對(duì)于 git 依賴(lài)項(xiàng),這是提交 sha。
  • 已解析:對(duì)于注冊(cè)表源,這是相對(duì)于注冊(cè)表 URL 的 tarball 路徑。如果 tarball URL 與注冊(cè)表 URL 不在同一臺(tái)服務(wù)器上,那么這是一個(gè)完整的 URL。
  • bundled:如果為 true,則這是捆綁的依賴(lài)項(xiàng),將由父模塊安裝。安裝時(shí),這個(gè)模塊會(huì)在提取階段從父模塊中提取出來(lái),而不是作為單獨(dú)的依賴(lài)項(xiàng)安裝。
  • dev: 如果為真,那么這個(gè)依賴(lài)要么是頂層模塊的開(kāi)發(fā)依賴(lài),要么是一個(gè)的傳遞依賴(lài)。對(duì)于既是頂級(jí)開(kāi)發(fā)依賴(lài)又是頂級(jí)非開(kāi)發(fā)依賴(lài)的傳遞依賴(lài)的依賴(lài),這是錯(cuò)誤的。
  • 可選:如果為真,那么這個(gè)依賴(lài)要么是頂層模塊的可選依賴(lài),要么是一個(gè)的傳遞依賴(lài)。對(duì)于既是頂層的可選依賴(lài)又是頂層非可選依賴(lài)的傳遞依賴(lài)的依賴(lài),這是錯(cuò)誤的。
  • 要求:這是模塊名稱(chēng)到版本的映射。這是此模塊所需的所有內(nèi)容的列表,無(wú)論它將安裝在哪里。版本應(yīng)該通過(guò)正常匹配規(guī)則匹配我們dependencies或比我們更高級(jí)別的依賴(lài)項(xiàng)。
  • 依賴(lài):這個(gè)依賴(lài)的依賴(lài),和頂層完全一樣。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)