鍍金池/ 教程/ PHP/ 為什么 Composer 不遞歸加載儲(chǔ)存庫?
簡(jiǎn)介 中文文檔
腳本
命令行
資源庫
庫(資源包)
Composer PHP依賴管理的新時(shí)代
插件
別名
自定義安裝程序
二進(jìn)制供應(yīng)庫和 <code>vendor/bin</code> 目錄
如何為我的框架自定義一個(gè)資源包安裝目錄?
composer.json 架構(gòu)
我應(yīng)該提交 vendor 目錄中的依賴包嗎?
為什么 Composer 不遞歸加載儲(chǔ)存庫?
基本用法
為什么說“比較符”和“通配符”相結(jié)合的版本約束是壞主意?

為什么 Composer 不遞歸加載儲(chǔ)存庫?

當(dāng)你使用自定義庫時(shí),你可能會(huì)碰到問題,因?yàn)?Composer 不會(huì)遞歸加載你要求的儲(chǔ)存庫,所以你必須修改這些儲(chǔ)存庫中所有的 composer.json 文件。

在詳細(xì)說明為什么是這樣之前,你需要明白:使用自定義 VCS & 包儲(chǔ)存庫去嘗試某些事情,或者使用你 fork 的一個(gè)分支,直到你的 pull request 被合并,等等。你不應(yīng)該使用它們來跟蹤你的私人資源包,關(guān)于這點(diǎn)你應(yīng)該看看 setting up Satis 來為你的公司甚至自己處理私人資源包。

這里有三個(gè)途徑可以使依賴解析器使用你自定義的儲(chǔ)存庫:

  • 讀取根包的存儲(chǔ)庫,從定義的存儲(chǔ)庫得到所有的軟件包,解析依賴需求。這是目前的狀態(tài),它工作得很好,除了有“無法遞歸的加載儲(chǔ)存庫”這個(gè)限制。

  • 讀取根包的存儲(chǔ)庫,同時(shí)從定義的 repos 初始化資源包,遞歸的初始化,根據(jù)所有依賴包中定義的 repos,以及這些依賴包所依賴的其它包中定義的 repos,等等,然后再解析依賴需求。這可能可以工作,但會(huì)嚴(yán)重影響初始化的速度,因?yàn)槊孔x取一個(gè) VCS repos 都需要幾秒鐘。它可能最終執(zhí)行失敗,因?yàn)橐粋€(gè)包的不同版本,可能來自一個(gè)包資源庫中一個(gè)相同的包,但來至不同的 dist/source 。這樣有太多的可能會(huì)出錯(cuò)。

  • 讀取根包的存儲(chǔ)庫,然后讀取第一級(jí)依賴,接著讀取這些依賴包所依賴的其它包,等等,然后再解析依賴需求。這樣聽起來更有效率,但仍然存在第二種解決方案中的問題。因?yàn)榧虞d依賴的儲(chǔ)存庫并不像聽起來那么容易。你需要加載所有可能匹配的依賴包的 repos,而這些包的定義又可能是互相沖突的。