成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一次 yarn 安裝依賴失敗,讓我重新認(rèn)識(shí)了 NPM 版本號(hào)規(guī)則

開發(fā) 前端
考慮一個(gè)問題,項(xiàng)目第一次添加一個(gè)模塊的依賴是 ^1.2.3?,過了兩周另一個(gè)同事需要修這個(gè)項(xiàng)目,此時(shí)依賴已經(jīng)更新到 1.3.0 他在重新安裝后就會(huì)得到最新的版本,這會(huì)帶來一個(gè)問題,每個(gè)人得到依賴版本不一致,該如何確保團(tuán)隊(duì)成員的依賴版本都是一致呢?

現(xiàn)代的前端開發(fā)、Node.js 后端開發(fā)中 NPM 包管理是最基礎(chǔ)也是最關(guān)鍵的一部分,本文將從一個(gè)問題開始,闡述 NPM 版本控制的工作原理,我相信這是每一個(gè)使用了 NPM 的開發(fā)人員都應(yīng)該熟悉的知識(shí)。

一個(gè)依賴安裝失敗示例

事情的經(jīng)過是前一天測試還一切正常,第二天部署時(shí)卻提示 yarn 安裝依賴失敗,下面是本地復(fù)現(xiàn)的結(jié)果,如下圖所示:

圖片

yarn 安裝失敗

一個(gè)明顯的提示是 bson@5.0.0? 這個(gè)依賴不再支持 Node.js 14.20.1? 以下版本,但是項(xiàng)目的 dependencies? 中也沒有指定這個(gè)包啊,了解 MongoDB 的同學(xué)應(yīng)該知道 bson? 是 Mongo? 實(shí)現(xiàn)的一個(gè)類 JSON 的二進(jìn)制存儲(chǔ)格式。

為了一探究竟,執(zhí)行 yarn --ignore-engines? 先忽略這個(gè)引擎檢測,看下 yarn.lock 文件中 bson 的依賴關(guān)系。

mongoose@^5.3.0? 是項(xiàng)目中的依賴,實(shí)際安裝后使用的版本為 5.13.5?,之后又依賴了 @types/mongodb?,問題來了,這里竟然使用了 @types/bson: *? 要知道在 NPM 的版本號(hào)規(guī)則里 *? 號(hào)是不會(huì)鎖定版本的,每次都會(huì)升級為最新版本,也就是最后的 bson: 5.0.0。

圖片

查了下 bson? 這個(gè)庫的 CHANGELOG 發(fā)現(xiàn)其在 2023-01-31? 號(hào)發(fā)布了 5.0.0,要求 Node.js 版本必須大于 14.20.1,上面報(bào)錯(cuò)顯然當(dāng)前版本不滿足。

庫的版本升級很正常,了解 NPM 版本號(hào)規(guī)則的同學(xué)應(yīng)該知道 “bson: 5.0.0 ”  這是一個(gè)大版本,會(huì)存在不向前兼容的情況,這里的問題在于 ?@types/mongodb? 直接使用了 ?@types/bson: *?,每次安裝都會(huì)升級到最新,是有點(diǎn)不講 “碼德”,這里是個(gè)坑,NPM 上查了 @types/mongodb 這個(gè)包,發(fā)現(xiàn)已經(jīng)被廢棄了,如下圖所示:

圖片

mongoose? 這個(gè)包的影響版本為:?mongoose 5.11 ~ 5.13.15。

這里先拋出一個(gè)問題:“為什么安裝時(shí)使用的 mongoose@^5.3.0? 安裝成功后卻變成了 5.13.15”?

NPM 的語義版本控制

在發(fā)布 NPM 模塊新版本時(shí),建議遵循 “語義版本控制” 考慮使用這樣的版本號(hào)x.y.z 控制,如下所示:

圖片

版本號(hào)規(guī)則:

  • 主版本:做了不兼容的 API 修改,不會(huì)向前兼容,一般也稱為大版本,當(dāng)項(xiàng)目依賴需要升級到大版本時(shí)需要注意。
  • 次版本:通常是做了向前兼容的新功能增加,一般也稱為小版本。
  • 補(bǔ)丁版本:修復(fù)現(xiàn)有的一些錯(cuò)誤,也是向前兼容的。

在發(fā)布 NPM 包時(shí)建議從 1.0.0 開始,例如:

  • 1.0.0:新產(chǎn)品首次發(fā)布。
  • 1.0.1:向前兼容的補(bǔ)丁版本,修改第 3 位數(shù)。
  • 1.1.0:向前兼容增加新特性,增加中間數(shù)字,將最后一位置為 0。
  • 2.0.0:不向前兼容的更新,增加第一位數(shù)字,將第二、三位數(shù)置為 0。

語義化版本號(hào)的幾種表示方法:

  • ^1.1.2:^ 是 NPM 安裝后的默認(rèn)符號(hào),保持高版本不升級,次版本、補(bǔ)丁版本升級到最新,例如:^1.1.2 等價(jià)于 1.1.2 >= ^1.1.2 < 2.0.0。
  • ~1.1.3?:波浪符 ~ 只會(huì)升級補(bǔ)丁版本,例如:~1.1.3 等價(jià)于 1.1.3 >= ~1.1.3 <1.2.0。
  • 1.1.3:不加任何符號(hào)表示鎖定了這個(gè)版本,不會(huì)進(jìn)行任何升級。
  • * 或 "":* 號(hào)或者空字符 "",不會(huì)鎖定版本,每次都會(huì)升級到最新版本,前面提的問題就是這個(gè)導(dǎo)致的。
  • 1.0.0-alpha.1:使用 alpha、rc 等標(biāo)識(shí)的表示該版本是一個(gè)預(yù)發(fā)布版本,該版本可能無法滿足預(yù)期的兼容性需求,正式環(huán)境不要用。
  • 一個(gè)非語義話版本號(hào)的示例 v1.0.0:在一些版本控制的系統(tǒng)中通常用 v 表示版本號(hào),例如 git tag v1.0.0,但它并不是語義化版本號(hào)。

了解了語義化版本號(hào)規(guī)則后,應(yīng)該要知道上面提出的一個(gè)問題:“為什么安裝時(shí)使用的 mongoose@^5.3.0? 安裝成功后卻變成了 5.13.15?”,因?yàn)榘姹咎?hào)前加 ^ 符號(hào),它表示的是第一位保持不變、最后兩位升級到最新。

依賴鎖定 - 解決版本不一致問題

考慮一個(gè)問題,項(xiàng)目第一次添加一個(gè)模塊的依賴是 ^1.2.3?,過了兩周另一個(gè)同事需要修這個(gè)項(xiàng)目,此時(shí)依賴已經(jīng)更新到 1.3.0 他在重新安裝后就會(huì)得到最新的版本,這會(huì)帶來一個(gè)問題,每個(gè)人得到依賴版本不一致,該如何確保團(tuán)隊(duì)成員的依賴版本都是一致呢?

解決依賴版本不一致的問題一種方法是 “固定依賴版本”,但在實(shí)際做法中這種很少見,大多數(shù)時(shí)候沒有意識(shí)到一個(gè)問題 “安全修復(fù)”,通過版本號(hào)前加 ^ 或 ~ 符號(hào)我們可以得到補(bǔ)丁版本錯(cuò)誤修復(fù)、向前兼容的小版本新功能。

解決依賴版本不一致的另一種方法是通過 lock 文件(NPM 中的 package-lock.json? 或 yarn 中的 yarn.lock )來解決同一個(gè)項(xiàng)目團(tuán)隊(duì)成員之間依賴版本不一致的問題,在使用 npm 或 yarn 安裝之前會(huì)先檢查 lock 文件上的版本,并來安裝它們,有必要將 lock 文件推送至 git 倉庫。

如果需要將依賴項(xiàng)更新到指定范圍的最新版本,只需要執(zhí)行 npm update 命令,該命令會(huì)遵循語義化版本控制對依賴進(jìn)行升級,同時(shí)也會(huì)更新 lock 文件。

責(zé)任編輯:武曉燕 來源: 編程界
相關(guān)推薦

2019-09-02 08:53:46

程序員

2014-01-06 11:23:54

Mesos設(shè)計(jì)架構(gòu)

2021-04-22 21:15:38

Generator函數(shù)生成器

2023-08-02 08:46:02

Go版本號(hào)規(guī)則

2016-11-07 11:34:28

數(shù)據(jù)可視化大數(shù)據(jù)

2016-12-13 15:41:40

JavaHashMap

2019-10-31 13:40:52

JavaPHP編程語言

2019-02-24 21:27:26

物聯(lián)網(wǎng)網(wǎng)關(guān)物聯(lián)網(wǎng)IOT

2022-09-08 13:58:39

Spring高并發(fā)異步

2021-11-11 05:00:02

JavaMmap內(nèi)存

2020-09-17 07:08:04

TypescriptVue3前端

2009-11-26 15:07:28

Cisco路由器接口

2020-10-15 07:13:53

算法監(jiān)控數(shù)據(jù)

2023-05-03 09:09:28

Golang數(shù)組

2017-01-03 17:22:16

公共云安全

2018-06-05 15:02:32

2023-01-16 14:49:00

MongoDB數(shù)據(jù)庫

2022-07-11 13:58:14

數(shù)據(jù)庫業(yè)務(wù)流程系統(tǒng)

2012-06-26 11:11:44

架構(gòu)師

2022-03-04 09:28:29

代碼訪問者模式軟件開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 伊人免费在线观看高清 | 午夜男人天堂 | jizjizjiz中国护士18 | 一区二区三区四区av | 国产精品成人一区二区三区 | 亚洲午夜电影 | 亚洲免费毛片 | 午夜电影福利 | 337p日本欧洲亚洲大胆鲁鲁 | 亚洲人成一区二区三区性色 | 国产a一区二区 | 国产一区二区三区四区 | 亚洲一区二区在线播放 | 精品动漫一区 | 水蜜桃亚洲一二三四在线 | 亚洲精品自在在线观看 | 亚洲第一中文字幕 | 成人免费看黄网站在线观看 | 亚洲第一视频网 | 老外黄色一级片 | 欧美日韩国产免费 | 成人老司机 | 视频1区 | 欧美片网站免费 | 日本精品裸体写真集在线观看 | 黄色永久免费 | 日韩成人在线一区 | 久久91精品国产一区二区三区 | 人人做人人澡人人爽欧美 | 精品久久久久久久久久久下田 | 免费国产一区 | 日韩有码一区 | av一区二区三区 | 欧美日日| 亚洲一区日韩 | 国产精品特级片 | 久久精品 | 91久久精品国产91久久 | 国产成人一区二区三区电影 | 国产精品久久久久久福利一牛影视 | 日韩国产在线观看 |