package.json中版本號詳解 來源
https://blog.csdn.net/weixin_40817115/article/details/86611179
指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式規定,安裝時只安裝指定版本。
波浪號(tilde)+指定版本:比如~1.2.2,表示安裝1.2.x的最新版本(不低于1.2.2),但是不安裝1.3.x,也就是說安裝時不改變大版本號和次要版本號。
^號(caret)+指定版本:比如?1.2.2,表示安裝1.x.x的最新版本(不低于1.2.2),但是不安裝2.x.x,也就是說安裝時不改變大版本號。需要注意的是,如果大版本號為0,則號的行為與波浪號相同,這是因為此時處于開發階段,即使是次要版本號變動,也可能帶來程序的不兼容。
~ 會匹配最近的小版本依賴包,比如~1.2.3會匹配所有1.2.x版本,但是不包括1.3.0
^ 會匹配最新的大版本依賴包,比如^1.2.3會匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
- 這意味著安裝最新版本的依賴包
推薦使用~,只會修復版本的bug,比較穩定
使用^ ,有的小版本更新后會引入新的問題導致項目不穩定,
比如:之前的weex老項目安裝依賴后頁面無法顯示,修改依賴版本后才正常
那么~和^的作用和區別是什么呢?
會匹配最近的小版本依賴包,比如1.2.3會匹配所有1.2.x版本,但是不包括1.3.0
會匹配最新的大版本依賴包,比如1.2.3會匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
詳細可參考http://stackoverflow.com/questions/22343224/whats-the-difference-between-tilde-and-caret-in-package-json
那么該如何選擇呢?當然你可以指定特定的版本號,直接寫1.2.3,前面什么前綴都沒有,這樣固然沒問題,但是如果依賴包發布新版本修復了一些小bug,那么需要手動修改package.json文件;~和^則可以解決這個問題。
但是需要注意版本更新可能比較大,會造成項目代碼錯誤,比如這篇文章(http://blog.csdn.net/u014291497/article/details/54427103)的問題就是因為package.json使用1.5.7造成的,1.6版本的包與現有代碼不兼容。
所以建議使用~來標記版本號,這樣可以保證項目不會出現大的問題,也能保證包中的小bug可以得到修復。
或者版本號寫*,這意味著安裝最新版本的依賴包,但缺點同上,可能會造成版本不兼容,慎用!
一、版本號簡介
軟件版本號有四部分組成:
第一部分為主版本號,變化了表示有了一個不兼容上個版本的大更改。
第二部分為次版本號,變化了表示增加了新功能,并且可以向后兼容。
第三部分為修訂版本號,變化了表示有bug修復,并且可以向后兼容。
第四部分為日期版本號加希臘字母版本號,希臘字母版本號共有五種,分別為base、alpha、beta 、RC 、 release
eg:
關于希臘版本號:
Base
此版本表示該軟件僅僅是一個假頁面鏈接,通常包括所有的功能和頁面布局,但是 頁面中的功能都沒有做完整的實現,只是做為整體網站的一個基礎架構。
Alpha
軟件的初級版本,表示該軟件在此階段以實現軟件功能為主,通常只在軟件開發者 內部交流,一般而言,該版本軟件的Bug較多,需要繼續修改,是測試版本。測試 人員提交Bug經開發人員修改確認之后,發布到測試網址讓測試人員測試,此時可 將軟件版本標注為alpha版。
Beta
該版本相對于Alpha 版已經有了很大的進步,消除了嚴重錯誤,但還需要經過多次 測試來進一步消除,此版本主要的修改對象是軟件的UI。修改的的Bug 經測試人 員測試確認后可發布到外網上,此時可將軟件版本標注為 beta版。
RC
該版本已經相當成熟,基本上不存在導致錯誤的Bug,與即將發行的正式版本相差無幾。
Release
該版本意味“最終版本”,在前面版本的一系列測試版之后,終歸會有一個正式的版本,是最終交付用戶使用的一個版本。該版本有時也稱標準版。
二、 package.json中的依賴
dependencies字段指定了項目運行所依賴的模塊,devDependencies指定項目開發所需要的模塊(測試階段和過渡階段的依賴應該加在DevDependencies中)。它們都指向一個對象。該對象的各個成員,分別由模塊名和對應的版本要求組成,表示依賴的模塊及其版本范圍。
eg:
{
"name": "ethopia-waza",
"description": "a delightfully fruity coffee varietal",
"version": "1.2.3",
"devDependencies": {
"coffee-script": "~1.6.3"
},
"dependencies": {
"bar": "file:../foo/bar"
}
}
模塊名和版本號被假定組合成一個唯一的標識符。
version字段必須能夠被node-semver解析。node-semver作為依賴項被捆綁進了npm中。
其實,版本號的寫法并不是只有我們熟知的 波浪號( ~3.8.0 )、插入號( ^3.8.0 )和3.8.0,只要是能夠被node-semver解析的寫法都是可以的。
主要有以下幾種:
示例:
version 必須確切匹配這個version
version 必須大于這個version
=version 必須大于等于這個version
< version 必須小于這個version
<=version 必須小于等于這個version
~version 大約相當于version
^version 與version兼容
1.2.x 可以是1.2.0、1.2.1等,但不能是1.3.0
http://… URL作為依賴項
- 匹配任何版本
“”(空字符串) 匹配任何版本,和*一樣
version1 - version2 相當于 >=version1 <=version2
range1 || range2 range1或range2其中一個滿足時采用該version
git… Git URL作為依賴項
user/repo GitHub URLs
tag 一個以tag發布的指定版本,參考npm-tag
path/path/path 本地Paths
{
"dependencies": {
"foo": "1.0.0 - 2.9999.9999",
"bar": ">=1.0.2 <2.1.2", 必須大于等于1.0.2版本且小于2.1.2版本
"baz": ">1.0.2 <=2.3.4", 必須大于1.0.2版本且小于等于2.3.4版本
"boo": "2.3.1", 必須匹配這個版本
"boo": "~2.3.1", 約等于2.3.1,只更新最小版本,相當于2.3.X,即>=2.3.1 <2.4.0
"thr": "2.3.x",
"boo": "^2.3.1", 與2.3.1版本兼容,相當于2.X.X, 即>=2.3.1 < 3.0.0,不改變大版本號。
"qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
"asd": "http://asdf.com/asdf.tar.gz", 在版本上指定一個壓縮包的url,當執行npm install 時這個壓縮包會被下載并安裝到本地。
"til": "~1.2",
"elf": "~1.2.3",
"two": "2.x",
"lat": "latest", 安裝最新版本
"dyl": "file:../dyl", 使用本地路徑
"adf": "git://github.com/user/project.git#commit-ish" 使用git URL加commit-ish
}
}
三、版本范圍詳解
連字符范圍:X.Y.Z-A.B.C
指明版本范圍
1.2.3 - 2.3.4: >=1.2.3 <=2.3.4
起始版本不全: 缺少的部分補0
1.2 - 2.3.4: 相當于1.2.0 - 2.3.4;
結束版本不全:所有以其開頭的版本均符合要求
1.2.3 - 2.3 :相當于 >=1.2.3 < 2.4.0
1.2.3 - 2: 相當于 >=1.2.3 < 3.0.0
帶有X的版本范圍:“1.2.X ”、“1.X” 、“1.2.*”
任何帶有X、x 和 *的版本號都是有誰存在就要匹配誰。
*:>=0.0.0
“”: >=0.0.0
1.x: >=1.0.0 <2.0.0
1.2.x: >=1.2.0 <1.3.0
1: >=1.0.0 <2.0.0
1.2: >=1.2.0 <1.3.0
波浪號范圍 ~1.2.3 ~1.2 ~1
~1.2.3: >=1.2.3 <1.3.0, 只能更新
~1.2: >=1.2.0 <1.3.0(相當于~1.2.0,1.2.x)
~1:>=1.0.0 <2.0.0 (相當于1.X,所有的1.X.X)
~1.2.3-beta.2: >=1.2.3-beta.2 <1.3.0