成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

npm的lock機(jī)制解析

BlackFlagBin / 1396人閱讀

摘要:但往往中指定的是一個(gè)版本范圍,例如以上這個(gè)指定的范圍是版本號(hào)大于等于且大版本號(hào)為。之后的機(jī)制滿(mǎn)足了要求鎖版本的開(kāi)發(fā)者們的需要,我們只需要拿到一份就可以知道要安裝的依賴(lài)的具體版本號(hào)。

npm是什么

npm是一個(gè)包管理工具,開(kāi)源作者可以把開(kāi)源包發(fā)布在平臺(tái)上供其他人下載使用。前端的同學(xué)基本都使用過(guò)npm,這里就不做過(guò)多介紹。日常工作中npm的主要用途就是根據(jù)項(xiàng)目的package.json使用npm install去安裝依賴(lài)。

npm install可以說(shuō)是我們使用最頻繁的一個(gè)指令。在npm5版本之前,npm install會(huì)根據(jù)package.json指定的依賴(lài)版本去進(jìn)行安裝。但往往package.json中指定的是一個(gè)版本范圍,例如:

"dependencies": {
    "packageA": "^2.0.0"
},

以上這個(gè) ^2.0.0 指定的范圍是版本號(hào)大于等于2.0.0且大版本號(hào)為2。即2.6.10這個(gè)是符合的,而3.0.0和1.0.0這種是不符合的。

這樣的范圍指定會(huì)導(dǎo)致一個(gè)問(wèn)題:A新建了一個(gè)項(xiàng)目,生成了上面這份package.json文件,但A安裝依賴(lài)的時(shí)間比較早,此時(shí)packageA的最新版本是2.1.0,該版本與代碼兼容,沒(méi)有出現(xiàn)bug。后來(lái)B克隆了A的項(xiàng)目,在安裝依賴(lài)時(shí)packageA的最新版本是2.2.0,那么根據(jù)語(yǔ)義npm會(huì)去安裝2.2.0的版本,但2.2.0版本的API可能發(fā)生了改動(dòng),導(dǎo)致代碼出現(xiàn)bug。

這就是package.json會(huì)帶來(lái)的問(wèn)題,同一份package.json在不同的時(shí)間和環(huán)境下安裝會(huì)產(chǎn)生不同的結(jié)果。

理論上這個(gè)問(wèn)題是不應(yīng)該出現(xiàn)的,因?yàn)閚pm作為開(kāi)源世界的一部分,也遵循一個(gè)發(fā)布原則:相同大版本號(hào)下的新版本應(yīng)該兼容舊版本。即2.1.0升級(jí)到2.2.0時(shí)API不應(yīng)該發(fā)生變化。

但很多開(kāi)源庫(kù)的開(kāi)發(fā)者并沒(méi)有嚴(yán)格遵守這個(gè)發(fā)布原則,導(dǎo)致了上面的這個(gè)問(wèn)題。

lock機(jī)制
一個(gè)新的事物的誕生都是為了解決一個(gè)歷史問(wèn)題

基于這種狀況,npm5推出了lock機(jī)制。在使用npm5.0.0之后的版本時(shí),npm install后會(huì)自動(dòng)生成package-lock.json文件,該文件記錄了當(dāng)前這次install所安裝的依賴(lài)版本號(hào)。

例如當(dāng)package.json的依賴(lài)如下:

"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指明的直接依賴(lài)的版本,也記錄了間接依賴(lài)的版本。

如果我們想在不同環(huán)境和不同時(shí)間下每次install時(shí)安裝相同版本的依賴(lài),我們就可以把package-lock.json帶上。

當(dāng)package.json和package-lock.json同時(shí)存在時(shí),npm install會(huì)去檢測(cè)package-lock.json指定的依賴(lài)版本是否在package.json指定的范圍內(nèi)。如果在,則安裝package-lock.json指定的版本。如果不在,則忽略package-lock.json,并且用安裝的新版本號(hào)覆蓋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 ci

npm5之后的lock機(jī)制滿(mǎn)足了要求鎖版本的開(kāi)發(fā)者們的需要,我們只需要拿到一份package-lock.json就可以知道要安裝的依賴(lài)的具體版本號(hào)。但細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)當(dāng)package-lock.json指定的版本號(hào)不在package.json指定的范圍內(nèi)時(shí),package-lock.json就會(huì)被更新覆蓋。這可不利于我們?nèi)ゾS持版本的固定。

因此后續(xù)npm也推出了npm ci的指令來(lái)解決這一問(wèn)題,npm ci和npm i的不同之處在于:當(dāng)package-lock.json指定的依賴(lài)版本不在package.json指定的依賴(lài)版本范圍內(nèi)時(shí),npm會(huì)報(bào)錯(cuò)并取消安裝。

這樣我們就不怕在package-lock和package.json不一致時(shí)發(fā)生覆蓋更新。

總結(jié)

在npm5.6以后我們就可以放心大膽地使用package-lock.json文件來(lái)鎖版本,而在構(gòu)建部署時(shí)可以使用npm ci安裝命令來(lái)防止npm install的覆蓋更新問(wèn)題。

寫(xiě)在最后

我個(gè)人開(kāi)了一個(gè)公眾號(hào)“前端搬運(yùn)小工”,我會(huì)定期推送優(yōu)秀的前端精選文章,拒絕無(wú)腦基礎(chǔ)入門(mén)的文章,帶給你不一樣的前端視角。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105074.html

相關(guān)文章

  • 2018 年了,你還是只會(huì) npm install 嗎

    摘要:無(wú)需手動(dòng)拷貝文件或者創(chuàng)建軟鏈接到目錄,有更優(yōu)雅的解決方案。這是因?yàn)樽R(shí)別協(xié)議的,得知這個(gè)包需要直接從文件系統(tǒng)中獲取,會(huì)自動(dòng)創(chuàng)建軟鏈接到中,完成安裝過(guò)程。 nodejs 社區(qū)乃至 Web 前端工程化領(lǐng)域發(fā)展到今天,作為 node 自帶的包管理工具的 npm 已經(jīng)成為每個(gè)前端開(kāi)發(fā)者必備的工具。但是現(xiàn)實(shí)狀況是,我們很多人對(duì)這個(gè)nodejs基礎(chǔ)設(shè)施的使用和了解還停留在: 會(huì)用 npm insta...

    libxd 評(píng)論0 收藏0
  • 你想知道關(guān)于package-lock.json一切,但是太害怕了問(wèn)了?

    摘要:內(nèi)容結(jié)構(gòu)是中列出的每個(gè)依賴(lài)項(xiàng)的大型列表,應(yīng)安裝的特定版本,模塊的位置,驗(yàn)證模塊完整性的哈希,它需要的包列表,以及依賴(lài)項(xiàng)列表。期望與真實(shí)行為之間的這種沖突在中引發(fā)了一個(gè)非常有趣的問(wèn)題線索。此更改是作為的一部分發(fā)布的,該版本于年月日上線。 showImg(https://segmentfault.com/img/bVbkuXN?w=1440&h=1080); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳Git...

    OBKoro1 評(píng)論0 收藏0
  • 前端構(gòu)建工具(2) -- npm&yarn

    摘要:如果使用了代表代表,則跳過(guò)提問(wèn)階段,直接生成一個(gè)新的文件。 前言 簡(jiǎn)介:node的包管理器,它隨nodejs一起安裝,即你安裝了nodejs就可以用npm進(jìn)行包管理,通過(guò)npm可以從npm服務(wù)器下載別人上傳的第三方庫(kù),下載并安裝別人上傳的命令行程序,上傳自己寫(xiě)的第三方庫(kù)和命令行程序可用npm -v查看npm版本號(hào)確定npm是否可用,如果npm版本過(guò)低,可以使用npm -install ...

    zhangke3016 評(píng)論0 收藏0
  • 前端核心工具:yarn、npm、cnpm三者如何優(yōu)雅在一起使用 ?

    摘要:由于文件中版本號(hào)的特點(diǎn),下面三個(gè)版本號(hào)在安裝的時(shí)候代表不同的含義。安裝版本統(tǒng)一為了防止拉取到不同的版本,有一個(gè)鎖定文件記錄了被確切安裝上的模塊的版本號(hào)。 showImg(https://segmentfault.com/img/bVbs8Rg?w=1920&h=1080); 一位用不好包管理器的前端,是一個(gè)入門(mén)級(jí)前端,一個(gè)用不好webpack的前端,是一個(gè)初級(jí)前端 三個(gè)包管理器是可以一...

    sihai 評(píng)論0 收藏0
  • 前端核心工具:yarn、npm、cnpm三者如何優(yōu)雅在一起使用 ?

    摘要:由于文件中版本號(hào)的特點(diǎn),下面三個(gè)版本號(hào)在安裝的時(shí)候代表不同的含義。安裝版本統(tǒng)一為了防止拉取到不同的版本,有一個(gè)鎖定文件記錄了被確切安裝上的模塊的版本號(hào)。 showImg(https://segmentfault.com/img/bVbs8Rg?w=1920&h=1080); 一位用不好包管理器的前端,是一個(gè)入門(mén)級(jí)前端,一個(gè)用不好webpack的前端,是一個(gè)初級(jí)前端 三個(gè)包管理器是可以一...

    plus2047 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<