下面由composer教程欄目給大家介紹composer的波浪線符號~和冪符號^的區(qū)別,希望對需要的朋友有所幫助!
曾經(jīng)見過太多亂寫版本號的(其實現(xiàn)在比以前好很多了),好多 1.9.0 的下個版本必然是 2.0.0, 2.9.0 下個版本必須 3.0.0……主要還是因為之前對版本號的命名就沒有規(guī)范,大家都是看心情寫。后來 semantic versioning 得到推廣,版本號取名的情況得到改善,但依然有很多人不知道三段式版本號是什么含義(各種培訓學校你們教一下這些規(guī)范會死么……)。
簡單來說(我也就是搬運一下,上面提到的網(wǎng)站說的更清楚),三段式版本號各個段的含義是:
大版本.小版本.補丁版本
先說最明顯的補丁版本。如果你的軟件或者庫,之前有一些 bug 被修復了,此時補丁版本需要 1。
再來說小版本號。如果你增加了新的功能,比如 rpg 游戲增加了自動拾取東西,或者你的代碼庫里增加了一個新的方法,用戶升級了你的代碼庫也不會導致兼容問題(bc),那么小版本號 1。
最后,如果你的軟件完全重構了,或者你的代碼庫完全重構以至于用戶升級了新的庫必然導致兼容問題,那么大版本號 1。
當然,還會有同時修改了 bug 并增加了功能的情況,總之如果前一位需要 1,無論何種情況后面的位數(shù)都必須清零。
對于面向終端用戶的軟件,其實也用不著太嚴格,因為終端用戶也不太關心版本(除了大版本號……,所以出現(xiàn)了 chrome 風格的版本號,火狐也跟著帶壞……),但對于庫文件作者,還是遵守版本號的好,因為你定的版本號,提供了很重要的信息給庫調用者,他們需要通過你的版本號來判斷是否要避免兼容性問題。
舉個比較經(jīng)典的例子,雖然 symfony 2/3/4 用起來也都差不多,但是因為這三個版本之間已經(jīng)出現(xiàn)接口不一致的情況,所以大版本號必須得 1。如果你的庫文件有接口改變導致不兼容之前版本,哪怕只有一個,也應該將大版本號 1。
而如果你用 symfony 3.0.x 開發(fā)了一些項目,即使直接升級到 3.4.x,理論上來說也是完全沒有問題的。
說完三段式版本號,再來說說一個比較困擾 phper 的問題,到底 composer.json 里指定版本號的 ^ 符號和 ~ 符號到底是什么意思?有什么區(qū)別?
寫這篇博客之前其實我在百度上搜了一下,想知道相關的文章是否很多,這篇文章還值得寫否。搜索結果顯示也的確有人總結過。雖然大都只有一個例子:
~1.2.3 代表 1.2.3 <= 版本號 < 1.3.0
^1.2.3 代表 1.2.3 <= 版本號 < 2.0.0
根據(jù)以上搬運內容,我再補充一點點,~表示版本號只能改變最末尾那段(如果是 ~x.y 末尾就是 y,如果是 ~x.y.z 末尾就是 z),比如這種情況:
~1.2 等于 >=1.2.0; <2.0.0
而 ^ 符號,就跟上面說了那么多的 semantic versioning 有關系了,它表示盡量使用最新版本,但保證不產(chǎn)生兼容問題,換句話說也就是除了大版本號以外,小版本號和補丁版本號都可以變。
但目前看來有一個很重要的細節(jié)大家都沒說到,在 semantic versioning 里,0 開頭的版本號是比較特殊的,而因為 ^ 嚴格遵守 semantic versioning 規(guī)則,所以會出現(xiàn)以下情況(早先的 composer 版本并沒有這樣的處理,后來修正了):
^0.3.0 等于 >=0.3.0; <0.4.0
咦?難道不應該是 <1.0.0 嗎?
究其原因,semantic versioning 的規(guī)定是,大版本號以 0 開頭表示這是一個非穩(wěn)定版本(unstable),如果處于非穩(wěn)定狀態(tài),小版本號是允許不向下兼容的!所以如果你要指定 0 開頭的庫那一定要注意:
~0.1 這種寫法是很危險的,因為 ~0.1 等于 >=0.1.0; <1.0.0,可能出現(xiàn)無法向下兼容的情況,比較保險的寫法還是
^0.1(等于 >=0.1.0; <0.2.0)