2014-05-14 39 views
6

我有一個包含多個模塊的項目。每個模塊都在其內部使用Composer,並且大多獨立於其他模塊。Multiple Composer自動加載器的執行順序

但是,某些模塊共享具有不同版本的依賴關係。這些依賴關係大部分向後兼容,並使用語義版本控制。

我想確保具有最高語義版本的依賴性優先。這將允許所有模塊共享相同的依賴關係,並且這些依賴關係的向後兼容性將確保沒有任何中斷。

我的計劃是通過控制個別自動加載機上的命令require_once來完成此操作。下面的代碼是一個例子,在實踐中生成。

require_once(__DIR__ . '/moduleA/vendor/autoload.php'); 
require_once(__DIR__ . '/moduleB/vendor/autoload.php'); 
require_once(__DIR__ . '/moduleC/vendor/autoload.php'); 

我正在主要的假設是,如果自動加載磁帶機之前需要另一個,它會優先於後來者。

我發現雖然是對面是真實的。自動加載器最後似乎優先於其他人。

考慮一個類Foo\MyClass是這些模塊之間共享的依賴項。我期待着上面的加載順序,Foo\MyClass將從moduleA/vendor/...中提取。

取而代之的是來自moduleC/vendor/...

我可以翻轉我生成的命令來解決這個問題,但我想驗證是否有一個可預測的PHP自動加載器的順序。

是否有PHP執行自動加載器的順序?多個Composer自動加載器是否會以任何方式影響此?

謝謝。

+1

找到了答案,默認情況下,Composer預裝它是自動加載器。 –

+0

我有同樣的情況,今天你使用多個自動加載器還是隻有一個具有所有的依賴關係? –

回答

8

事實上,你陷入了一片混亂,但你已經沒有看到這個混亂了。

你的情況有什麼不好是你的模塊可能依賴於不兼容的第三方庫。您提到他們使用語義版本控制,但是這僅涵蓋向上兼容性,如「如果以兼容的方式添加新功能以增加舊版本,則增加次要版本」。這意味着這個新版本不會向後兼容!

假設模塊A正在使用庫的版本1.0.7,而模塊B正在使用版本1.2.5。該庫在版本1.2中添加了新的方法,模塊B正在使用該方法。模塊B可以運行模塊A的類版本1.0.7嗎?當然不是。您希望這兩個模塊都使用兩個模塊的最高兼容版本運行,即1.2.5。

如何得到它?只使用一個Composer自動加載器,並只使用一箇中央依賴性定義。

如果您可以創建一個包含所有模塊A,B和C的依賴項的composer.json文件,並且每個模塊聲明它是對其他庫的依賴項,Composer將收集所有這些庫,計算「最佳」可用版本它,並創建一個自動加載器,將明確加載這些庫只。

增加的好處:每個庫只有一個版本沒有重複。只有一個自動加載器對象具有關於所有可用類的全局知識(可以優化自動加載)。

而你在那裏的一半。您的每個模塊必須已有本地composer.json,其中說明了版本要求。請添加一個用於自動加載該模塊本身的定義,併爲其命名。然後,您可以在中心composer.json中引用該名稱(如果它們是私密的,您可能需要添加存儲庫),並且您幾乎完成了。如果你真的需要定義路徑中的這些模塊,也許有一些擺弄路徑。

但就是這樣。

然後你解決了另一件事情:如果模塊A需要模塊B的一小部分呢?使用Composer,您可以將依賴關係與所有庫一起聲明,即使您忘記安裝模塊B,Composer也會爲您做,或者提醒您。

+0

感謝Sven爲我們深思熟慮的答案。正如您正確指出的那樣,這隻會覆蓋向上兼容性。直到核心項目採用Composer之前,這不幸是一個停止差距安排。該計劃最終將所有內容移交給Composer。但它需要逐步完成,取代小塊。每件作品都是作曲家模塊。不是理想的,但它可以是或不是Composer! –

+0

很好的答案!我有類似的情況,你知道一個擁有較少供應商的自動加載器是否會對性能產生重大影響?我認爲這將是擁有多個自動加載器的唯一原因。 –

+1

我不會嘗試自己評估任何性能數字,而不進行性能測試。事實上這完全與被測試的情況有關,並且很難一概而論。換句話說:即使您發現擁有多個小型自動加載器比單個大型自動加載器快一點,但它僅適用於您正在測量的情況。說明「較小的自動加載器總是更快」可能是錯誤的,最重要的是:管理多個composer.json依賴文件是一個真正的混亂,應該避免。 – Sven