摘要:但往往中指定的是一個(gè)版本范圍,例如以上這個(gè)指定的范圍是版本號大于等于且大版本號為。之后的機(jī)制滿足了要求鎖版本的開發(fā)者們的需要,我們只需要拿到一份就可以知道要安裝的依賴的具體版本號。
npm是什么
npm是一個(gè)包管理工具,開源作者可以把開源包發(fā)布在平臺上供其他人下載使用。前端的同學(xué)基本都使用過npm,這里就不做過多介紹。日常工作中npm的主要用途就是根據(jù)項(xiàng)目的package.json使用npm install去安裝依賴。
npm install可以說是我們使用最頻繁的一個(gè)指令。在npm5版本之前,npm install會(huì)根據(jù)package.json指定的依賴版本去進(jìn)行安裝。但往往package.json中指定的是一個(gè)版本范圍,例如:
"dependencies": { "packageA": "^2.0.0" },
以上這個(gè) ^2.0.0 指定的范圍是版本號大于等于2.0.0且大版本號為2。即2.6.10這個(gè)是符合的,而3.0.0和1.0.0這種是不符合的。
這樣的范圍指定會(huì)導(dǎo)致一個(gè)問題:A新建了一個(gè)項(xiàng)目,生成了上面這份package.json文件,但A安裝依賴的時(shí)間比較早,此時(shí)packageA的最新版本是2.1.0,該版本與代碼兼容,沒有出現(xiàn)bug。后來B克隆了A的項(xiàng)目,在安裝依賴時(shí)packageA的最新版本是2.2.0,那么根據(jù)語義npm會(huì)去安裝2.2.0的版本,但2.2.0版本的API可能發(fā)生了改動(dòng),導(dǎo)致代碼出現(xiàn)bug。
這就是package.json會(huì)帶來的問題,同一份package.json在不同的時(shí)間和環(huán)境下安裝會(huì)產(chǎn)生不同的結(jié)果。
理論上這個(gè)問題是不應(yīng)該出現(xiàn)的,因?yàn)閚pm作為開源世界的一部分,也遵循一個(gè)發(fā)布原則:相同大版本號下的新版本應(yīng)該兼容舊版本。即2.1.0升級到2.2.0時(shí)API不應(yīng)該發(fā)生變化。
但很多開源庫的開發(fā)者并沒有嚴(yán)格遵守這個(gè)發(fā)布原則,導(dǎo)致了上面的這個(gè)問題。
lock機(jī)制一個(gè)新的事物的誕生都是為了解決一個(gè)歷史問題
基于這種狀況,npm5推出了lock機(jī)制。在使用npm5.0.0之后的版本時(shí),npm install后會(huì)自動(dòng)生成package-lock.json文件,該文件記錄了當(dāng)前這次install所安裝的依賴版本號。
例如當(dāng)package.json的依賴如下:
"dependencies": { "vue": "^2.0.0" },
install后自動(dòng)生成的package-lock.json會(huì)指定安裝vue2.6.10版本(當(dāng)前最新)
"dependencies": { "vue": { "version": "2.6.10", "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.10.tgz", "integrity": "sha1-pysaQqTYKnIepDjRtr9V5mGVxjc=" } }
package-lock.json相當(dāng)于本次install的一個(gè)快照,它不僅記錄了package.json指明的直接依賴的版本,也記錄了間接依賴的版本。
如果我們想在不同環(huán)境和不同時(shí)間下每次install時(shí)安裝相同版本的依賴,我們就可以把package-lock.json帶上。
當(dāng)package.json和package-lock.json同時(shí)存在時(shí),npm install會(huì)去檢測package-lock.json指定的依賴版本是否在package.json指定的范圍內(nèi)。如果在,則安裝package-lock.json指定的版本。如果不在,則忽略package-lock.json,并且用安裝的新版本號覆蓋package-lock.json。
舉個(gè)例子:
// package.json "dependencies": { "vue": "^2.0.0" } // package-lock.json "dependencies": { "vue": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.1.0.tgz", "integrity": "sha1-KTuj76rKhGqmvL+sRc+FJMxZfj0=" } }
這種情況下package-lock.json指定的2.1.0在^2.0.0指定的范圍內(nèi),npm install會(huì)安裝vue2.1.0版本。
// package.json "dependencies": { "vue": "^2.2.0" } // package-lock.json "dependencies": { "vue": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.1.0.tgz", "integrity": "sha1-KTuj76rKhGqmvL+sRc+FJMxZfj0=" } }
這種情況下package-lock.json指定的2.1.0不在^2.2.0指定的范圍內(nèi),npm install會(huì)按照^2.2.0的規(guī)則去安裝最新的2.6.10版本,并且將package-lock.json的版本更新為2.6.10。
值得注意的是npm5一發(fā)布時(shí)并不是采取這種install邏輯,在npm5.0到npm5.6之間install的邏輯發(fā)生了多次變更,而在npm5.6之后一直沿用當(dāng)前這種邏輯。
npm cinpm5之后的lock機(jī)制滿足了要求鎖版本的開發(fā)者們的需要,我們只需要拿到一份package-lock.json就可以知道要安裝的依賴的具體版本號。但細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)當(dāng)package-lock.json指定的版本號不在package.json指定的范圍內(nèi)時(shí),package-lock.json就會(huì)被更新覆蓋。這可不利于我們?nèi)ゾS持版本的固定。
因此后續(xù)npm也推出了npm ci的指令來解決這一問題,npm ci和npm i的不同之處在于:當(dāng)package-lock.json指定的依賴版本不在package.json指定的依賴版本范圍內(nèi)時(shí),npm會(huì)報(bào)錯(cuò)并取消安裝。
這樣我們就不怕在package-lock和package.json不一致時(shí)發(fā)生覆蓋更新。
總結(jié)在npm5.6以后我們就可以放心大膽地使用package-lock.json文件來鎖版本,而在構(gòu)建部署時(shí)可以使用npm ci安裝命令來防止npm install的覆蓋更新問題。
寫在最后我個(gè)人開了一個(gè)公眾號“前端搬運(yùn)小工”,我會(huì)定期推送優(yōu)秀的前端精選文章,拒絕無腦基礎(chǔ)入門的文章,帶給你不一樣的前端視角。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105074.html
摘要:無需手動(dòng)拷貝文件或者創(chuàng)建軟鏈接到目錄,有更優(yōu)雅的解決方案。這是因?yàn)樽R別協(xié)議的,得知這個(gè)包需要直接從文件系統(tǒng)中獲取,會(huì)自動(dòng)創(chuàng)建軟鏈接到中,完成安裝過程。 nodejs 社區(qū)乃至 Web 前端工程化領(lǐng)域發(fā)展到今天,作為 node 自帶的包管理工具的 npm 已經(jīng)成為每個(gè)前端開發(fā)者必備的工具。但是現(xiàn)實(shí)狀況是,我們很多人對這個(gè)nodejs基礎(chǔ)設(shè)施的使用和了解還停留在: 會(huì)用 npm insta...
摘要:內(nèi)容結(jié)構(gòu)是中列出的每個(gè)依賴項(xiàng)的大型列表,應(yīng)安裝的特定版本,模塊的位置,驗(yàn)證模塊完整性的哈希,它需要的包列表,以及依賴項(xiàng)列表。期望與真實(shí)行為之間的這種沖突在中引發(fā)了一個(gè)非常有趣的問題線索。此更改是作為的一部分發(fā)布的,該版本于年月日上線。 showImg(https://segmentfault.com/img/bVbkuXN?w=1440&h=1080); 想閱讀更多優(yōu)質(zhì)文章請猛戳Git...
摘要:如果使用了代表代表,則跳過提問階段,直接生成一個(gè)新的文件。 前言 簡介:node的包管理器,它隨nodejs一起安裝,即你安裝了nodejs就可以用npm進(jìn)行包管理,通過npm可以從npm服務(wù)器下載別人上傳的第三方庫,下載并安裝別人上傳的命令行程序,上傳自己寫的第三方庫和命令行程序可用npm -v查看npm版本號確定npm是否可用,如果npm版本過低,可以使用npm -install ...
摘要:由于文件中版本號的特點(diǎn),下面三個(gè)版本號在安裝的時(shí)候代表不同的含義。安裝版本統(tǒng)一為了防止拉取到不同的版本,有一個(gè)鎖定文件記錄了被確切安裝上的模塊的版本號。 showImg(https://segmentfault.com/img/bVbs8Rg?w=1920&h=1080); 一位用不好包管理器的前端,是一個(gè)入門級前端,一個(gè)用不好webpack的前端,是一個(gè)初級前端 三個(gè)包管理器是可以一...
摘要:由于文件中版本號的特點(diǎn),下面三個(gè)版本號在安裝的時(shí)候代表不同的含義。安裝版本統(tǒng)一為了防止拉取到不同的版本,有一個(gè)鎖定文件記錄了被確切安裝上的模塊的版本號。 showImg(https://segmentfault.com/img/bVbs8Rg?w=1920&h=1080); 一位用不好包管理器的前端,是一個(gè)入門級前端,一個(gè)用不好webpack的前端,是一個(gè)初級前端 三個(gè)包管理器是可以一...
閱讀 3689·2021-10-13 09:40
閱讀 3149·2021-10-09 09:53
閱讀 3551·2021-09-26 09:46
閱讀 1848·2021-09-08 09:36
閱讀 4248·2021-09-02 09:46
閱讀 1314·2019-08-30 15:54
閱讀 3179·2019-08-30 15:44
閱讀 1023·2019-08-30 11:06