node.js - 我是否提交了由npm 5創建的package-lock.json文件?




package-lock.json gitignore (7)

在做git diff時,人們抱怨噪音:

git diff -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'

我做的是使用別名:

alias gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'"

要忽略整個存儲庫(每個人都使用它)的差異中的package-lock.json,可以將其添加到 .gitattributes

package-lock.json binary
yarn.lock binary

這將導致顯示“二進製文件a / package-lock.json和b / package-lock.json在包更改包文件時發生變化的差異。此外,一些Git服務(特別是GitLab,但不包括GitHub)也將排除在執行此操作時,在線查看時,差異中的這些文件(不會更改10k行!)。

npm 5今天發布 ,其中一項新功能包括確定性安裝,並創建了一個 package-lock.json 文件。

這個文件應該保存在源代碼管理中嗎?

我假設它類似於 yarn.lock composer.lock ,兩者都應該保存在源代碼控制中。


我不在我的項目中提交此文件。 重點是什麼 ?

  1. 它是生成的
  2. 這是gitlab中使用gitlab-ci.yml構建的SHA1代碼完整性錯誤的原因

雖然我從來沒有在我的package.json中使用^用於libs,因為我對它有糟糕的經歷:)

問候。


是的, package-lock.json 旨在檢入源代碼管理。 如果您使用的是npm 5,則可以在命令行中看到: created a lockfile as package-lock.json. You should commit this file. created a lockfile as package-lock.json. You should commit this file. 根據 npm help package-lock.json

對於npm修改 node_modules 樹或 package.json 任何操作,都會自動生成 package-lock.json 。 它描述了生成的確切樹,以便後續安裝能夠生成相同的樹,而不管中間依賴性更新。

此文件旨在提交到源存儲庫 ,並用於各種目的:

  • 描述依賴關係樹的單個表示,以確保隊友,部署和持續集成能夠安裝完全相同的依賴關係。

  • 為用戶提供一種“時間旅行”到 node_modules 先前狀態的 node_modules 而無需提交目錄本身。

  • 通過可讀的源代碼控制差異來促進樹更改的更大可見性。

  • 並通過允許npm跳過以前安裝的軟件包的重複元數據解析來優化安裝過程。

關於 package-lock.json 一個關鍵細節是它無法發布,如果在toplevel包以外的任何地方找到它,它將被忽略。 它與npm-shrinkwrap.json(5)共享一種格式,它本質上是同一個文件,但允許發布。 除非部署CLI工具或使用發布過程生成生產包,否則不建議這樣做。

如果 package-lock.jsonnpm-shrinkwrap.json package-lock.json 都存在於包的根目錄中,那麼 package-lock.json 將被完全忽略。


是的,你應該提交 package-lock.json

我還強烈建議在CI和本地開發機器上構建應用程序時使用 npm ci 而不是 npm install ,並且該工作流程 需要 package-lock.json

npm install 命令的一大缺點是它可能會改變 package-lock.json ,而 npm ci 只使用 package-lock.json 指定的版本,如果 package-lock.jsonpackage.json 不同步 package-lock.json 產生錯誤。

因此,在本地運行 npm install ,尤其是 在擁有多個開發人員的大型團隊中,可能會導致 package-lock.json 和開發人員之間發生大量衝突,從而決定完全刪除 package-lock.json

然而,有一個強大的用例是能夠相信項目的依賴關係可以在不同的機器上以可靠的方式重複解決。

package-lock.json 你可以得到:一個已知的工作狀態。

在過去,我有沒有 package-lock.json / npm-shrinkwrap.json yarn.lock / yarn.lock 文件的項目, yarn.lock 文件的構建將在一天內失敗,因為隨機依賴關係得到了更新。

這些問題很難解決,因為你有時不得不猜測最後一個工作版本是什麼。

如果要添加新依賴項,仍可以運行 npm install {dependency} 。 如果要升級,請使用 npm update {dependency} 並提交已更改的 package-lock.json 。 (如果升級失敗,您可以恢復到上一個工作 package-lock.json 。)

引用npm doc

強烈建議您將生成的包鎖提交給源代碼控制:這將允許團隊中的其他任何人,您的部署,CI /持續集成以及在您的包源中運行npm install的任何其他人獲得完全相同的依賴關係樹你正在開發的。 此外,這些更改的差異是人類可讀的,並將告知您npm對node_modules所做的任何更改,因此您可以注意到是否有任何傳遞依賴項已更新,提升等。

關於 npm cinpm install 之間 區別

  • 該項目必須具有現有的package-lock.json或npm-shrinkwrap.json。
  • 如果包鎖中的依賴項與package.json中的依賴項不匹配,則 npm ci 將退出並顯示錯誤,而不是更新包鎖。
  • npm ci 一次只能安裝整個項目:使用此命令無法添加單個依賴項。
  • 如果 node_modules 已經存在,它將在 npm ci 開始安裝之前自動刪除。
  • 它永遠不會寫入 package.json 或任何package-locks:installs基本上都是凍結的。

注意:我在 here 發布了類似的答案


是的,您可以提交此文件。 來自 npm的官方文檔

對於 npm 修改 node_modules 樹或 package.json 任何操作,都會自動生成 package-lock.json 。 它描述了生成的確切樹,以便後續安裝能夠生成相同的樹,而不管中間依賴性更新。

此文件旨在提交到源存儲庫[。]


是的,提交package-lock.json是一種標準做法

提交package-lock.json的主要原因是項目中的每個人都在同一個包版本上。

優點: -

  • 項目中的每個人都將使用相同的軟件包版本,您只需要做的就是

    npm安裝

  • 如果您遵循嚴格的版本控制並且不允許自動更新到主要版本以避免第三方軟件包中的向後不兼容的更改,則提交軟件包鎖定有很大幫助。

缺點: -

  • 它可以讓你的拉動請求看起來很難看:)

是的,最佳做法是辦理登機手續

我同意在看到差異時會引起很多噪音或衝突。 但好處是:

  1. 保證每個包的完全相同的版本 。 當在不同時間在不同環境中構建時,這部分是最重要的。 您可以在 package.json 使用 ^1.2.3 ,但是如何確保每次 npm install 都會在您的開發機器和構建服務器中獲取相同的版本,尤其是那些間接依賴包? 好吧, package-lock.json 將確保這一點。 (在 npm ci 的幫助下,根據鎖文件安裝包)
  2. 它改善了安裝過程。
  3. 它有助於新的審計功能 npm audit fix (我認為審計功能來自npm版本6)。






lockfile