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

时间:2014-07-31 09:17:31

标签: composer-php guzzle

我已经安装了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中,只出现在composer.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].

3 个答案:

答案 0 :(得分:4)

您无需将Guzzle添加到composer.json。您需要做的就是在添加新软件包时更新Guzzle。 (这将降级Guzzle以匹配PredictionIO的要求)

简单地运行

composer update predictionio/predictionio guzzle/guzzle

如您所见,您可以通过用空格分隔多个包来composer update。这在the documentation

中有所描述

答案 1 :(得分:2)

与该问题有关的一些提示:

通过运行composer update named/package,您只允许添加此程序包或增加其版本,但不允许其他任何内容。使用composer require named/package:~1.0会发生相同的(但只添加内容)(这是添加内容而不必混淆json格式的好方法)。

更新内容时最简单的解决方案是仅运行composer update。如果没有包名,则可以更新所有包。

如果您在选择软件包时不小心,更新所有内容可能会有点冒险。就个人而言,我建议使用似乎使用语义版本控制的软件,这非常好地允许在Composer中使用波浪号版本要求。我说每个人都应该尝试使用~X.Y作为版本说明,因为这样可以安装补丁和兼容的更新。

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

不惜一切代价避免依赖分支机构。如果不可避免地使用分支,请为其分配别名版本号:require: { "named/package": "dev-master as 1.2.2" }如果无法从早期版本中猜出正确的版本号,请从0.0.0开始。这样,您可以稍后切换到已发布的版本,这将更好地集成到其他版本号中。

答案 2 :(得分:1)

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

    "guzzle/guzzle" : "3.8.0",

然后

  composer update guzzle/guzzle