这可能(应该)以前在某个地方被问过,但我似乎找不到答案。如果有人提供链接我可以删除这篇文章!:
只是想了解一些作曲家的功能(可能也适用于其他包管理器)。
基本上我只是想知道作曲家在以下场景中会做什么:
1.
我的主项目有一个依赖项:
"guzzlehttp/guzzle": "5.0.*",
我的外部包依赖于
"guzzlehttp/guzzle": "5.0.*",
composer 是否安装 guzzlehttp/guzzle 一次,因为它知道它只需要一次?
2. 相同的场景,但将来如果有人更新主项目以使用:
"guzzlehttp/guzzle": "6.0.*",
composer 现在会安装 2 个版本的 guzzle(5 和 6)(我认为这是它应该做的),还是会采用最高版本(即 6)?另外,如果有 2 个版本,这是否会导致任何冲突,因为命名空间可能相同?
谢谢
是的,Composer 只能安装每个扩展/包的一个版本。
因为答案1:Composer会认为你的主项目和外部包不兼容。
在这种情况下你可以
今天我们遇到了一种情况,我们使用多个库,一个使用 Guzzle v5,另一个使用 Guzzle v6。升级(或降级)不是一个可行的选择,因为它是第三方代码,因此我们必须能够安装两个版本的 Guzzle。
这就是我们所做的。这是一个“彻底的水力压裂黑客”,我建议仅将其作为绝对的最后手段。它有效,但更新您的调用代码以仅使用一个版本是一个更好的选择。 诀窍是您需要重新命名两个版本之一。在我们的例子中,我们决定将 v6 更改为 GuzzleHttp6。具体方法如下:
确保您的
composer.json
"require": {
"guzzlehttp/guzzle": "^6.2"
// possible other stuff
},
composer install
/vendor/guzzlehttp
/vendor-static/guzzlehttp
目录。在 /vendor-static
GuzzleHttp替换为 GuzzleHttp6。这有效地将 Guzzle 6 代码带入新的命名空间。 现在更新您的
composer.json
/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 。
/vendor-static
目录中获得的 Guzzle v6 版本如何,都将永远存在,因此您可能需要不时更新它。
composer require guzzlehttp/guzzle:"6.5.8 as 5.3.4"