作曲家如何处理同一个包的多个版本?

时间:2014-11-26 13:39:55

标签: symfony composer-php

这可能(应该)在某个地方被问过,但我似乎无法找到答案。如果有人提供了链接,我可以删除这篇文章!:

只是试图了解一些作曲家(也可能适用于其他包经理)的功能。

基本上我只是想知道作曲家在以下场景中做了什么:

1

我的主项目有一个依赖:

"guzzlehttp/guzzle": "5.0.*",

我的外部捆绑包依赖于

"guzzlehttp/guzzle": "5.0.*",

作曲家是否会安装guzzlehttp / guzzle一次,因为它知道它只需要一次?

2。 相同的情况,但将来如果有人更新要使用的主项目:

"guzzlehttp/guzzle": "6.0.*",

作曲家现在会安装两个版本的guzzle(5和6)(我认为这是应该做的),还是会采用最高版本(即6)?此外,如果有2个版本会导致任何冲突,因为名称空间可能相同吗?

由于

2 个答案:

答案 0 :(得分:19)

提问1

是Composer只能安装每个扩展/包的一个版本。

提问2

由于答案1:Composer会认为您的主项目和外部包不兼容。

在这种情况下你可以

  • 也在主项目中使用第5版。
  • 要求外部包所有者升级到版本6,如果它兼容。
  • 分叉外部包并使其与版本6兼容

答案 1 :(得分:0)

我们今天遇到的情况是我们使用了多个库,其中一个使用了Guzzle v5,另一个使用了Guzzle v6。升级(或降级)不是一个可行的选择,因为它是第三方代码,因此我们必须能够安装这两个版本的Guzzle。

这就是我们所做的。这是断裂总数,我建议这样做只是绝对的不得已。它可以工作,但是将您的调用代码更新为仅使用一个版本是一个更好的选择。

诀窍是您需要重新命名两个版本之一的空间。在我们的案例中,我们决定将v6更改为GuzzleHttp6。操作方法如下:

  1. 确保您的composer.json已启用v6:

"require": {
        "guzzlehttp/guzzle": "^6.2"
        // possible other stuff
    },

  1. composer install来安装Guzzle v6的所有依赖项。
  2. /vendor/guzzlehttp目录移到新的/vendor-static/guzzlehttp目录。
  3. 在区分大小写的/vendor-static目录中查找并替换,以将 GuzzleHttp 替换为 GuzzleHttp6 。这有效地将Guzzle 6代码带入了新的命名空间。
  4. 现在更新您的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/"
            }
        },

  1. composer update删除旧的Guzzle v6,然后安装Guzzle v5。这还将安装psr/http-messageralouphie/getallheaders依赖项。

  2. 您可能需要执行composer dump-autoload来强制自动加载器添加新的包含路径。从理论上讲,这应该发生在composer update上,但是我不得不强行使用它。

  3. 现在更新您的呼叫代码;而不是调用 \ GuzzleHttp ,而是调用 \ GuzzleHttp6

就是这样。您应该能够同时运行。请注意,您在/vendor-static目录中获得的Guzzle v6的任何版本都将永久存在,因此您可能需要不时进行更新。