composer 如何处理同一个包的多个版本?

问题描述 投票:0回答:3

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

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

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

1.

我的主项目有一个依赖项:

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

我的外部包依赖于

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

composer 是否安装 guzzlehttp/guzzle 一次,因为它知道它只需要一次?

2. 相同的场景,但将来如果有人更新主项目以使用:

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

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

谢谢

symfony composer-php
3个回答
39
投票

对于问题1

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

对于问题2

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

在这种情况下你可以

  • 在您的主项目中也保留版本 5。
  • 要求外部软件包所有者也升级到版本 6(如果兼容)。
  • 自己分叉外部包并使其兼容版本6

26
投票

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

这就是我们所做的。这是一个“彻底的水力压裂黑客”,我建议仅将其作为绝对的最后手段。它有效,但更新您的调用代码以仅使用一个版本是一个更好的选择。 诀窍是您需要重新命名两个版本之一。在我们的例子中,我们决定将 v6 更改为 GuzzleHttp6。具体方法如下:

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

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

    composer install
  1. 安装 Guzzle v6 的所有依赖项。
  2. /vendor/guzzlehttp
  3. 目录移至新的
    /vendor-static/guzzlehttp
    目录。
  4. /vendor-static
  5. 目录上执行区分大小写的查找和替换,以将
    GuzzleHttp
    替换为 GuzzleHttp6。这有效地将 Guzzle 6 代码带入新的命名空间。 现在更新您的
  6. composer.json
  7. 以手动包含 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-message
    ralouphie/getallheaders
    依赖项。
    
    

  2. 您可能需要执行
  3. composer dump-autoload

    来强制自动加载器添加新的包含路径。理论上这应该发生在

    composer update
    但我不得不强迫它。
    
    

  4. 现在更新您的调用代码;您将调用
  5. \GuzzleHttp6

    ,而不是调用 \GuzzleHttp

  6. 就是这样。您应该能够同时运行两者。请注意,无论您在
/vendor-static

目录中获得的 Guzzle v6 版本如何,都将永远存在,因此您可能需要不时更新它。

    


0
投票

composer require guzzlehttp/guzzle:"6.5.8 as 5.3.4"

© www.soinside.com 2019 - 2024. All rights reserved.