Composer 两个包在依赖版本上发生冲突

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

我已经安装了 geoip2 软件包。当我前段时间安装它时,它需要 guzzle 3.*,因此它安装了 guzzle 3.9.1 作为其依赖项之一。

现在我想安装 predicitonio 包,所以我将其添加到我的composer.json

"require": {
    ...
    ...
    "geoip2/geoip2": "0.6.*",
    "predictionio/predictionio": "~0.7.1"
}

问题是predictionio需要guzzle 3.8.0或3.8.1,它不接受已经安装的3.9.1版本。

我相信guzzle 3.8.0会满足geoip2predictionio,所以问题是我如何降级guzzle,记住guzzle不会出现在我的composer.json中,只出现在作曲家.lock.

下面是我运行时的输出

composer update predictionio/predictionio

  Problem 1
    - Installation request for predictionio/predictionio ~0.7.1 -> satisfiable by predictionio/predictionio[v0.7.1].
    - Conclusion: remove guzzle/guzzle v3.9.1
    - predictionio/predictionio v0.7.1 requires guzzle/guzzle ~3.8.0 -> satisfiable by guzzle/guzzle[v3.8.0, v3.8.1].
    - Can only install one of: guzzle/guzzle[v3.9.1, v3.8.0].
    - Can only install one of: guzzle/guzzle[v3.9.1, v3.8.1].
    - Installation request for guzzle/guzzle == 3.9.1.0 -> satisfiable by guzzle/guzzle[v3.9.1].
composer-php guzzle
4个回答
5
投票

您无需将 Guzzle 添加到您的

composer.json
。您所要做的就是在添加新软件包时更新 Guzzle。 (这将降级 Guzzle 以符合 PredictionIO 的要求)

只需运行

composer update predictionio/predictionio guzzle/guzzle

如您所见,您可以向

composer update
提供多个包,并用空格分隔它们。这在文档中进行了描述。


2
投票

与问题相关的一些提示:

通过运行

composer update named/package
,您只允许添加此包或增加其版本,而不允许其他任何操作。
composer require named/package:~1.0
也会发生同样的情况(但只是添加内容)(这是添加内容的好方法,而不必弄乱 json 格式)。

更新内容时最简单的解决方案是仅运行

composer update
。如果没有软件包名称,所有软件包都可能会更新。

如果您不小心选择软件包,更新所有内容可能会有点风险。就我个人而言,我建议使用似乎使用语义版本控制的软件,这非常好地允许在 Composer 中使用波形符版本要求。我想说每个人都应该尝试使用

~X.Y
作为版本描述,因为这允许安装补丁以及兼容更新。

您使用的库应该允许其依赖项有足够的松散定义版本。在您的示例中,

predictionio/predictionio
软件包需要
guzzle/guzzle:~3.8.0
- 他们可能有理由这样做,但反过来又迫使每个尝试使用其软件的人使用 Guzzle 3.8.0 或 3.8.1。我怀疑 Guzzle 维护者会破坏向后兼容性,因为他们知道他们创建了一个非常重要的基本软件,预计可以正常工作,而且我认为如果他们破坏了东西,他们很快就会收到错误报告。我非常希望看到任何库的依赖关系,以允许不受限制地兼容更新,即在这种情况下
~3.8
会好得多。

不惜一切代价避免依赖分支机构。如果不可避免地要使用分支,请为其指定一个别名版本号:

require: { "named/package": "dev-master as 1.2.2" }
如果无法从早期版本中猜测出正确的版本号,请从 0.0.0 开始。这样您就可以稍后切换到已发布的版本,这将更好地集成到其余版本号中。


1
投票

如果您想安装特定版本的软件包,只需将其添加到您的composer.json中的require部分:

    "guzzle/guzzle" : "3.8.0",

然后

  composer update guzzle/guzzle

0
投票

您可以使用composer-isolation在前缀命名空间下安装一组不同的依赖项。

例如,您可以拥有 GuzzleHttp 和 Legasy\GuzzleHttp。

https://github.com/ological-and/composer-isolation

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