这可能(应该)在某个地方被问过,但我似乎无法找到答案。如果有人提供了链接,我可以删除这篇文章!:
只是试图了解一些作曲家(也可能适用于其他包经理)的功能。
基本上我只是想知道作曲家在以下场景中做了什么:
1
我的主项目有一个依赖:
"guzzlehttp/guzzle": "5.0.*",
我的外部捆绑包依赖于
"guzzlehttp/guzzle": "5.0.*",
作曲家是否会安装guzzlehttp / guzzle一次,因为它知道它只需要一次?
2。 相同的情况,但将来如果有人更新要使用的主项目:
"guzzlehttp/guzzle": "6.0.*",
作曲家现在会安装两个版本的guzzle(5和6)(我认为这是应该做的),还是会采用最高版本(即6)?此外,如果有2个版本会导致任何冲突,因为名称空间可能相同吗?
由于
答案 0 :(得分:19)
是Composer只能安装每个扩展/包的一个版本。
由于答案1:Composer会认为您的主项目和外部包不兼容。
在这种情况下你可以
答案 1 :(得分:0)
我们今天遇到的情况是我们使用了多个库,其中一个使用了Guzzle v5,另一个使用了Guzzle v6。升级(或降级)不是一个可行的选择,因为它是第三方代码,因此我们必须能够安装这两个版本的Guzzle。
这就是我们所做的。这是断裂总数,我建议这样做只是绝对的不得已。它可以工作,但是将您的调用代码更新为仅使用一个版本是一个更好的选择。
诀窍是您需要重新命名两个版本之一的空间。在我们的案例中,我们决定将v6更改为GuzzleHttp6。操作方法如下:
composer.json
已启用v6:
"require": {
"guzzlehttp/guzzle": "^6.2"
// possible other stuff
},
composer install
来安装Guzzle v6的所有依赖项。/vendor/guzzlehttp
目录移到新的/vendor-static/guzzlehttp
目录。/vendor-static
目录中查找并替换,以将 GuzzleHttp 替换为 GuzzleHttp6 。这有效地将Guzzle 6代码带入了新的命名空间。composer.json
,以手动包含Guzzle自己的依赖项,然后将代码自动加载到/vendor-static
文件夹中。请注意,您将要删除主要的guzzle require语句(或将其更改为包括guzzle 5);
"require": {
"guzzlehttp/guzzle": "~5",
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5"
},
"autoload": {
"files": ["vendor-static/guzzlehttp/guzzle/src/functions_include.php",
"vendor-static/guzzlehttp/psr7/src/functions_include.php",
"vendor-static/guzzlehttp/promises/src/functions_include.php"],
"psr-4": {
"GuzzleHttp6\\": "vendor-static/guzzlehttp/guzzle/src/",
"GuzzleHttp6\\Psr7\\": "vendor-static/guzzlehttp/psr7/src/",
"GuzzleHttp6\\Promise\\": "vendor-static/guzzlehttp/promises/src/"
}
},
composer update
删除旧的Guzzle v6,然后安装Guzzle v5。这还将安装psr/http-message
和ralouphie/getallheaders
依赖项。
您可能需要执行composer dump-autoload
来强制自动加载器添加新的包含路径。从理论上讲,这应该发生在composer update
上,但是我不得不强行使用它。
现在更新您的呼叫代码;而不是调用 \ GuzzleHttp ,而是调用 \ GuzzleHttp6 。
就是这样。您应该能够同时运行。请注意,您在/vendor-static
目录中获得的Guzzle v6的任何版本都将永久存在,因此您可能需要不时进行更新。