摘要:內(nèi)容結(jié)構(gòu)是中列出的每個(gè)依賴項(xiàng)的大型列表,應(yīng)安裝的特定版本,模塊的位置,驗(yàn)證模塊完整性的哈希,它需要的包列表,以及依賴項(xiàng)列表。期望與真實(shí)行為之間的這種沖突在中引發(fā)了一個(gè)非常有趣的問題線索。此更改是作為的一部分發(fā)布的,該版本于年月日上線。
想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!
簡介如果你已經(jīng)將節(jié)點(diǎn)包管理(npm)更新到版本5.x.x,看起來一切似乎都很順利。等等,這是什么?用 npm 初始化項(xiàng)目的會(huì)自動(dòng)創(chuàng)建了一個(gè)新文件 package-lock.json。如果打開它,它看起來有點(diǎn)像 package.json 的依賴項(xiàng),但更冗長。我們決定忽略它,繼續(xù)開發(fā)項(xiàng)目。最終,我們有時(shí)會(huì)遇到依賴項(xiàng)的問題,找不到,或者安裝了錯(cuò)誤的版本。大多數(shù)人最終都會(huì)刪package-lock.json和運(yùn)行“npm install”。那么,為什么要有它呢? 它應(yīng)該做什么? 它實(shí)際上是做什么的?
總結(jié)如果你使用的 npm 版本 為 ^5.x.x , package-lock.json 會(huì)默認(rèn)自動(dòng)生成
你應(yīng)該使用 package-lock 來確保一致的安裝和兼容的依賴關(guān)系
你應(yīng)該將 package-lock 提交到源代碼控制
從npm ^ 5.1.x開始,package.json能夠勝過 package-lock.json,所以你遇到較少讓人頭痛的問題
不再刪除 package-lock 只是為了運(yùn)行npm install并重新生成它
背景 語義版本控制在你了解 package-lock 甚至 package.jso n之前,你必須了解語義版本控制(semver)。 這是npm背后的天才,是什么使它更成功。 你可以在 此處 閱讀有關(guān)npm如何使用它的更多信息。簡而言之,如果你正在構(gòu)建與其他應(yīng)用程序接口的應(yīng)用程序,你應(yīng)該告知你所做的更改將如何影響第三方與你的應(yīng)用程序交互的能力。這是通過語義版本控制完成的,版本由三部分組成:X,Y,Z,分別是主要版本,次要版本和補(bǔ)丁版本。
例如:1.2.3,主要版本1,次要版本2,補(bǔ)丁3。
補(bǔ)丁中的更改表示不會(huì)破壞任何內(nèi)容的錯(cuò)誤修復(fù)。 次要版本的更改表示不會(huì)破壞任何內(nèi)容的新功能。 主要版本的更改代表了一個(gè)破壞兼容性的大變化。 如果用戶不適應(yīng)主要版本更改,則內(nèi)容將無法正常工作。
管理包npm 存在使管理包變得容易。你的項(xiàng)目可能有數(shù)百個(gè)依賴項(xiàng),每個(gè)依賴項(xiàng)都有一百個(gè),為了讓你的注意力遠(yuǎn)離依賴地獄,通過 npm 管理,使用一些簡單的命令,你可以安裝和管理這些依賴關(guān)系,幾乎不必考慮它們。
當(dāng)您使用npm安裝包(并保存它)時(shí),會(huì)在 package.json 中添加一個(gè)包含包名稱和應(yīng)該使用的 semver的條目。默認(rèn)情況下,npm 安裝最新版本,并預(yù)先插入版本號(hào),例如 “^1.2.12”,這表示至少應(yīng)該使用版本 1.2.12,但任何高于此版本的版本都可以,只要它具有相同的主要版本,由于次要版本和補(bǔ)丁編號(hào)僅代表錯(cuò)誤修正和非破壞性添加, 你可以安全地使用任何更高版本的同一主要版本。閱讀更多關(guān)于semver通配符的信息,請(qǐng)看 這里。
共享項(xiàng)目在 package.json 中定義這樣的依賴項(xiàng)的真正好處是,任何有權(quán)訪問 package.json 的人都可以創(chuàng)建一個(gè)包含運(yùn)行應(yīng)用程序所需模塊的依賴項(xiàng)文件夾,但是讓我們來看看事情可能出錯(cuò)的具體方式。
假設(shè)我們創(chuàng)建了一個(gè)將使用 express 的新項(xiàng)目。 運(yùn)行npm init后,我們安裝express:npm install express - save。在編寫代碼時(shí),最新的版本是4.15.4,所以 “express”:“^ 4.15.4”作為我的package.json中的依賴項(xiàng)添加,并且我的電腦安裝了確切的版本。
現(xiàn)在也許明天,express 的維護(hù)者會(huì)發(fā)布 bug 修復(fù),因此最新版本變?yōu)?.15.5。 然后,如果有人想要為我的項(xiàng)目做貢獻(xiàn),他們會(huì)克隆它,然后運(yùn)行`npm install。"因?yàn)?.15.5是具有相同主要版本的更高版本,所以為它們安裝。 我們都安裝 express ,但我們卻是不同的版本。
從理論上講,它們應(yīng)該仍然是兼容的,但也許bugfix會(huì)影響我們正在使用的功能,而且當(dāng)使用Express版本4.15.4和4.15.5運(yùn)行時(shí),我們的應(yīng)用程序會(huì)產(chǎn)生不同的結(jié)果。
Package-lock 目的package-lock.json 的目的是避免上述情況,其中從同一 package.json 安裝模塊會(huì)導(dǎo)致兩種不同的安裝。 在 npm 版本 5.x.x 中添加了 package-lock.json,因此如果你使用的是主要版本 5 或更高版本,除非您禁用它,否則它會(huì)自動(dòng)生成。
內(nèi)容結(jié)構(gòu)package-lock 是 package.json 中列出的每個(gè)依賴項(xiàng)的大型列表,應(yīng)安裝的特定版本,模塊的位置(URI),驗(yàn)證模塊完整性的哈希,它需要的包列表 ,以及依賴項(xiàng)列表。 讓我們來看看 express 的列表是什么:
"express": { "version": "4.15.4", "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", "requires": { "accepts": "1.3.3", "array-flatten": "1.1.1", "content-disposition": "0.5.2", "content-type": "1.0.2", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.8", "depd": "1.1.1", "encodeurl": "1.0.1", "escape-html": "1.0.3", "etag": "1.8.0", "finalhandler": "1.0.4", "fresh": "0.5.0", "merge-descriptors": "1.0.1", "methods": "1.1.2", "on-finished": "2.3.0", "parseurl": "1.3.1", "path-to-regexp": "0.1.7", "proxy-addr": "1.1.5", "qs": "6.5.0", "range-parser": "1.2.0", "send": "0.15.4", "serve-static": "1.12.4", "setprototypeof": "1.0.3", "statuses": "1.3.1", "type-is": "1.6.15", "utils-merge": "1.0.0", "vary": "1.1.1" } },
可以在“requires”部分中列出的每個(gè)包中找到等效條目。
npm(^5.x.x.x)后的做法,npm 使用package-lock.json,而不是使用 package.json 來解析和安裝模塊。因?yàn)?package-lock 為每個(gè)模塊及其每個(gè)依賴項(xiàng)指定了版本,位置和完整性哈希,所以它每次創(chuàng)建的安裝都是相同的。 無論你使用什么設(shè)備,或者將來安裝它都無關(guān)緊要,每次都應(yīng)該給你相同的結(jié)果,這非常有用。
爭議因此,如果引用 package-lock 是希望解決一個(gè)常見問題,為什么它的頂級(jí)搜索結(jié)果(除了npm文檔)都是關(guān)于禁用它或質(zhì)疑它扮演的角色?
在npm 5.x.x之前,package.json 是項(xiàng)目的真實(shí)來源,npm 用戶喜歡這個(gè)模型,并且非常習(xí)慣于維護(hù)他們的包文件。 但是,當(dāng)首次引入 package-lock 時(shí),它的行為與有多少人預(yù)期的相反。 給定一個(gè)預(yù)先存在的包和package-lock,對(duì)package.json的更改(許多用戶認(rèn)為是真實(shí)的來源)沒有同步到package-lock 中。
示例:包A,版本 1.0.0 在 package.json 和 package.lock.json 中。 在package.json中,A被手動(dòng)編輯為1.1.0版。 如果認(rèn)為 package.json 是真實(shí)來源的用戶運(yùn)行 npm install,他們會(huì)期望安裝 1.1.0版。 但是,安裝了1.0.0版,即使列出的 v1.1.0 是 package.json, 他們也希望安裝是 1.0.0版。
示例: package-lock.json 中不存在模塊,但它存在于 package.json 中,作為一個(gè)將package.json 視為真實(shí)來源的用戶,我希望能夠安裝我的模塊。 但是,由于 package-lock.json 不存在該模塊,因此未安裝該模塊,并且我的代碼因無法找到模塊而失敗。
大部分時(shí)間,因?yàn)槲覀儫o法弄清楚為什么我們的依賴關(guān)系沒有被正確安裝,要么刪除了package-lock.json 并重新安裝,要么完全禁用 package-lock.json 來解決問題。
期望與真實(shí)行為之間的這種沖突在 npm repo中引發(fā)了一個(gè)非常有趣的問題線索。 有些人認(rèn)為package.json 應(yīng)該是事實(shí)的來源,有些人認(rèn)為,因?yàn)?package-lock 是 npm 用來創(chuàng)建安裝的東西,所以應(yīng)該被認(rèn)為是事實(shí)的來源。 這場(chǎng)爭議的解決方案在于 PR#17508。 如果 package.json 已更新,Npm 維護(hù)者添加了一個(gè)更改,導(dǎo)致package.json 覆蓋 package-lock。 現(xiàn)在,在上述兩種情況下,都會(huì)正確安裝用戶期望安裝的軟件包。 此更改是作為npm v5.1.0的一部分發(fā)布的,該版本于2017年7月5日上線。
你的點(diǎn)贊是我持續(xù)分享好東西的動(dòng)力,歡迎點(diǎn)贊!
歡迎加入前端大家庭,里面會(huì)經(jīng)常分享一些技術(shù)資源。文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/53398.html
摘要:背景個(gè)人背景就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專業(yè),現(xiàn)大四,北京實(shí)習(xí)前端方向,自學(xué),技術(shù)棧時(shí)間背景大概是在月日準(zhǔn)備好簡歷開始投遞秋招差不多已經(jīng)結(jié)束招聘崗位不多,投遞對(duì)象為大一些的互聯(lián)網(wǎng)公司事件背景第一個(gè)入職的是好未來的前端實(shí)習(xí)崗,待遇工 背景 個(gè)人背景 就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專業(yè),現(xiàn)大四,北京實(shí)習(xí) 前端方向,自學(xué),vue技術(shù)棧 時(shí)間背景 大概是在11月9日準(zhǔn)備...
摘要:背景個(gè)人背景就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專業(yè),現(xiàn)大四,北京實(shí)習(xí)前端方向,自學(xué),技術(shù)棧時(shí)間背景大概是在月日準(zhǔn)備好簡歷開始投遞秋招差不多已經(jīng)結(jié)束招聘崗位不多,投遞對(duì)象為大一些的互聯(lián)網(wǎng)公司事件背景第一個(gè)入職的是好未來的前端實(shí)習(xí)崗,待遇工 背景 個(gè)人背景 就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專業(yè),現(xiàn)大四,北京實(shí)習(xí) 前端方向,自學(xué),vue技術(shù)棧 時(shí)間背景 大概是在11月9日準(zhǔn)備...
摘要:終于,我在看到美團(tuán)的社招信息后,勇敢地邁出了第一步。當(dāng)時(shí)參加的是美團(tuán)點(diǎn)評(píng)部門的面試,部門前端技術(shù)棧是,后端用的。后來才知道美團(tuán)是一次性全部面完的。所以以后有去參加美團(tuán)面試的童鞋,最好做好面試四個(gè)小時(shí)的打算。 showImg(https://segmentfault.com/img/bV0c3T?w=672&h=361); 前言 我叫王小閏(花名),非科班出身,野生前端從業(yè)者,在小公司打...
摘要:終于,我在看到美團(tuán)的社招信息后,勇敢地邁出了第一步。當(dāng)時(shí)參加的是美團(tuán)點(diǎn)評(píng)部門的面試,部門前端技術(shù)棧是,后端用的。后來才知道美團(tuán)是一次性全部面完的。所以以后有去參加美團(tuán)面試的童鞋,最好做好面試四個(gè)小時(shí)的打算。 showImg(https://segmentfault.com/img/bV0c3T?w=672&h=361); 前言 我叫王小閏(花名),非科班出身,野生前端從業(yè)者,在小公司打...
閱讀 2627·2021-11-19 09:56
閱讀 873·2021-09-24 10:25
閱讀 1631·2021-09-09 09:34
閱讀 2194·2021-09-09 09:33
閱讀 1052·2019-08-30 15:54
閱讀 541·2019-08-29 18:33
閱讀 1264·2019-08-29 17:19
閱讀 505·2019-08-29 14:19