我已经安装了geop2包。当我不久前安装它时,它需要guzzle3.*,所以它安装了guzzle3.9.1作为它的依赖项之一。
现在我想安装predicitonio包,所以我把它添加到我的composer.json 中
"require": {
...
...
"geoip2/geoip2": "0.6.*",
"predictionio/predictionio": "~0.7.1"
}
问题是predictionio需要破解3.8.0或3.8.1,它不会接受已经安装的3.9.1版本。
我相信guzzle 3.8.0会同时满足geop2和predictionio,所以问题是我如何降级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].
您不需要将Guzzle添加到composer.json
中。你所要做的就是在添加新包时更新Guzzle。(这将降低Guzzle的等级以满足PredictionIO的要求(
只需运行
composer update predictionio/predictionio guzzle/guzzle
正如您所看到的,您可以通过用空格分隔多个包来向composer update
提供多个包。文档中对此进行了描述。
与问题相关的一些提示:
通过运行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开始。这样,您可以稍后切换到已发布的版本,这将更好地集成到其他版本号中。
如果你想安装一个特定版本的包,你可以简单地将其添加到require部分的composer.json中:
"guzzle/guzzle" : "3.8.0",
然后
composer update guzzle/guzzle