如果你還不知道composer,請前往composer使用教學欄位然後開始閱讀吧。
我曾經看過許多人被他們使用的 composer 套件之間依賴的約束問題所困擾。希望這篇文章能指出某些問題的原因,並提供避免這些問題的方法。我會從最糟的情景入手,並一步步改進限制。
全能的星號:*
Composer 有一個依賴解析器,所以它能夠自動的找出我想要的,對嗎?錯。
用 *
宣告一個版本限制可能是最糟糕的做法之一。因為你絕對無法控制你會得到什麼。它可能是 任何 匹配 minimum-stability
和其它約束的版本。
基本上你就等於在和 Composer 玩一個 俄羅斯輪盤 遊戲,最終你會被它傷害到。然後你就可能會怪罪這個工具太令你失望了。
如果你繼續粗心大意,請最起碼依賴最新的開發版本,通常被標記為 dev-master
。
寫死的分支名稱
所以你現在在使用 dev-master
。問題在於,dev-master
所指向的程式碼可能會更改。至少,你獲取的總是不穩定的包(從 composer 所表徵的穩定性標誌來看不穩定)。然而,更大的問題在於,dev-master
的意義可能隨時會改變。
比方說,現在它所表示的是最新的 1.0 開發版本。當開發者說他們要開始開發 1.1 版本的時候,dev-master
這個分支名字不再指向 1.0 分支,它開始指向最新的 1.1 開發分支。
除非你緊密地關注著該庫的開發,否則,直到你運行了 composer update
命令時,問題才會顯示在你面前,然後毀了你一整天。因此,直接引用分支的名稱並不是一個可持續的解決方案。幸運的是,在別名的問題上,composer
可以提供協助。
分支別名
分支別名作為一個屬性,套件維護者可以將其放到他們的 composer.json
裡面,允許這些分支名稱映射到版本上。
像 1.0 , 2.1 等等分支名稱並不是必須的,Composer
已經對這些進行了處理。
但是像 master
這樣的分支名稱會產生一個名為 dev-master
的版本,你一定要給它別名。 Composer
文件裡面有一個不錯的關於別名的文章,裡面解釋瞭如何定義分支別名:
{ "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } }
dev-master
版本會對應到一個 1.0.x-dev
的別名上,
這基本上意味著你可以用一個 1.0.*@dev
的限制來要求套件。這樣的好處是 1.0 的意思會被定義,不會改變。它也將使切換到穩定版本更容易。
分支別名的警告需要套件維護者將它們放入。如果使用的是沒有分支別名的庫,則向它們發送一個上拉請求,將上面的 extra
部分添加到它們的 composer.json
中。
穩定版本
1.0.*@dev
這個限制已經很不錯了。但問題是到目前為止,仍然還沒有一個穩定的版本。除了你仍然運行著一個不穩定的版本這個事實之外,你的程式碼並沒有什麼問題。
但如果別人的專案依賴了你的包,那麼你的用戶需要明確地使用 @dev
標識來允許Composer 安裝不穩定的版本,或者乾脆降低項目minimum-stability
的等級,這意味著他們將獲得所有依賴套件的不穩定版本。
避免開發版本不穩定性的最好方法就是打上 release 標籤(指發布穩定版本)。如果你正在使用一個沒有貼上 release
標籤的函式庫,提醒它的維護者直到貼上標籤。現在就做!
作為 Composer 社群的一份子,我們要有責任心。我們必須發布穩定的版本,並且應該維護好 CHANGELOG (更新日誌)。這很不容易,但是這將讓整個生態系統發生巨大的改變。記住,如實地、 語意化 地來打標籤。
當你發布了一個穩定的版本,你就能去掉 @dev
標識並且將你的約束改為 1.0.*
。
下一個重大版本
如果你所依賴的套件的每一個發布節點都堅持遵守語義化版本的規則,並且嚴格向後相容,那麼你就可以逐漸提高約束。
現在 1.0.*
版本有一些潛在的相容性問題,並很快發布了 1.1
版本。如果你的限制是 1.0
,但是別人需要 1.1
版本的新功能(還記得向後相容嗎?), 他們就無法安裝 1.1
版本。所以你需要重寫你的約束,例如: 1.*
。
好極了,除非你開始依賴 1.1
版本的新特性,否則你不必修改約束,它將會仍然符合 1.0
這個沒有新特性的版本。
接著,你修改限制為 >=1.1,<2.0
,但這種寫法比較麻煩。使用波浪線操作符能允許你用簡潔的方式表示上面的表達式: ~1.1
。這表示任意在 1.1 以上的 1.* 版本。現在你知道了,鼓勵語義化版本是為了使用波浪線操作符,並且可以最大化的封裝相容性。
TLDR
使用 branch-alias
。
標籤發布,使發布更可靠和 符合語義.
使用 ~
運算子。
以上是你必須知道的 Composer 版本約束的詳細內容。更多資訊請關注PHP中文網其他相關文章!