composer 在平常的開發中是經常的使用,但是從來沒有特別注意過 composer 包的版本約束,只是知道個大概,秉著活到老學到老的態度再次重新系統的學習下 composer 版本約束的具體規則。
##語義化版本
首先我們需要先了解一下語義化版本
這裡有一篇介紹語義化版本的文章,有時間的小夥伴可以看一下。下面總結一下:
版本格式: 主版本號.次版本號.修訂版本號
主版本號:當你做了不相容的 API 修改,
次版本號:當你做了向下相容的功能性新增,
修訂號:當你做了向下相容的問題修正。
先行版本號及版本編譯資訊可以加到“主版本號.次版本號.修訂號”的後面,作為延伸。
示例:
1.2.34
1 為主版本號
2 為次版本號
34 為修訂號
1.0.0-alpha1 這種在後面新增修飾符的表示先行版本。
寫法
不指定版本號(使用 * 號)
一般不建議使用
"require": {
"overtrue/wechat": "*"
}
使用 * 號在進行composer 更新的時候會安裝最新版本,如果第三方包的作者做了不相容的版本的更新,那麼更新後專案就跑步起來了。
使用 dev- 字首加分支名
一般在開發包的時候會使用
"require": {
"overtrue/wechat": "dev-master"
}
它表示使用該分支下最新的提交。
~ 符號約束小版本
這種方式比較常用
"require": {
"overtrue/wechat": "~1.2"
}
以上內容表示安裝 >= 1.2 且 <2.0 的版本。(1.3、1.4、1.5等 不大於 2.0 的版本)
如果寫成 “~1.2.3”,該約束表示 >=1.2.3 且 <1.2 (1.2.3、1.2.4、1.2.5 不大於 1.2 的版本)
~ 的作用是允許表示式中最後一位變到最大值
^ 符號約束大版本
這種方式也比較常用
"require": {
"overtrue/wechat": "^1.2"
}
以上內容表示可以安裝 >=1.2 且 <2.0.0 版本。
如果寫成 “^1.2.3” 則表示 >=1.2.3 且 <2.0.0 版本。
也就是說 ^ 鎖定不允許變的第一位
鎖定版本範圍
有時候我們的使用場景要求只能安裝某些版本範圍內的時候,可以使用 >、<、>=、<=、| 這些符號來組合,比如:>= 1.3 <1.6、>=1.3 | >=1.7 、3.0|4.0 等。這樣的使用場景並不多,根據你的情況來調整用法就好。
鎖定具體版本
"require": {
"overtrue/wechat": "1.2"
}
以上內容表示必須為 1.2 的版本。
注意事項
如果你的版本是 1.0 以下,0.0.1,0.9.99999 等這樣的版本的時候, ^ 的作用與 ~ 一樣,也就是說:
^0.0.3 與 ~0.0.3 一樣,都表示:>=0.0.3 < 0.0.4
因為主版本號為零(0.y.z)的軟體一般處於開發初始階段,一切都可能隨時被改變。
結論
透過上面的學習我們知道了語義化版本的重要性,composer 在執行 update 的時候會根據我們定義的版本約束進行升級,如果我們使用的第三方包沒有按照語義化版本來定義版本號,那麼在升級之後就會出現專案無法執行的情況。所以我們在使用第三方的包的時候一定要注意該包是否使用語義化版本來定義版本號(不知道怎麼選的,一般選擇用得人比較多的第三方包)。在有一點就是我們自己在開發擴充套件包的時候也需要安裝語義化版本來定義擴充套件包的版本號。
本作品採用《CC 協議》,轉載必須註明作者和本文連結