【问题标题】:Composer two packages conflicting on dependency versionComposer 两个包在依赖版本上冲突
【发布时间】:2014-09-23 04:15:29
【问题描述】:

我已经安装了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].

【问题讨论】:

    标签: composer-php guzzle


    【解决方案1】:

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

    简单运行

    composer update predictionio/predictionio guzzle/guzzle
    

    如您所见,您可以向composer update 提供多个包,方法是用空格分隔它们。这在the documentation 中有描述。

    【讨论】:

    • 感谢您的建议,但我运行了composer update predictionio/predictionio geoip2/geoip2,它给出了与问题中所示相同的输出。
    • 对不起,你是对的。但是,运行composer update predictionio/predictionio guzzle/guzzle 应该可以解决问题(我刚刚对其进行了测试,它对我有用)。我更新了答案。
    【解决方案2】:

    如果你想安装一个特定版本的包,你可以简单地将它添加到你的 composer.json 中的 require 部分:

        "guzzle/guzzle" : "3.8.0",
    

    然后

      composer update guzzle/guzzle
    

    【讨论】:

    • 感谢您的回答,尚未尝试过,但看起来应该可以。
    【解决方案3】:

    与问题相关的一些提示:

    通过运行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 开始。这样您就可以稍后切换到已发布的版本,该版本将更好地集成到其余版本号中。

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2021-09-21
      • 2020-09-03
      • 2013-05-22
      • 2018-01-31
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      相关资源
      最近更新 更多