运行composer install时如何解决两个包需求冲突?

Posted

技术标签:

【中文标题】运行composer install时如何解决两个包需求冲突?【英文标题】:How to solve two packages requirements conflicts when running composer install? 【发布时间】:2014-01-29 22:17:26 【问题描述】:

我要安装这两个包:

"anahkiasen/former": "dev-master" “vespakoen/menu”:“dev-master”

但是 composer 说它们每个都依赖于这个包的不同版本:

“anahkiasen/html-object”:“dev-master” “anahkiasen/html-object”:“1.1.2”

问题 1

- Installation request for anahkiasen/former dev-master -> satisfiable by anahkiasen/former[dev-master].
- Can only install one of: anahkiasen/html-object[dev-master, 1.1.2].
- vespakoen/menu dev-master requires anahkiasen/html-object 1.1.2 -> satisfiable by anahkiasen/html-object[1.1.2].
- anahkiasen/former dev-master requires anahkiasen/html-object dev-master -> satisfiable by anahkiasen/html-object[dev-master].
- Installation request for vespakoen/menu dev-master -> satisfiable by vespakoen/menu[dev-master].

我该如何解决?

【问题讨论】:

vespakoen 已修复它。但我保留其他软件包可能发生的问题。 【参考方案1】:

这里的基本问题是使用分支(dev-master)而不是标记版本。使用分支很可能以问题告终。我正在查看 *** 上的 Composer 问题,每次有人报告包有问题时,他们都在使用开发分支和 99% 的时间。

发生了什么事?我必须假设您是第一次安装这些软件包。所以 Composer 不会安装,而是更新包。否则,能够满足所有版本要求的工作版本集将记录在 composer.lock 中。

所以这里是依赖情况:两个包依赖第三个包,但是这两个需要不兼容的版本。

你能解决它吗?本地 composer.json 文件中只有一个工具可以安装第三个软件包:使用 inline version alias 安装它。

"require": 
    "anahkiasen/former": "dev-master",
    "vespakoen/menu": "dev-master",
    "anahkiasen/html-object": "dev-master as 1.1.2" /* add this line */

通过安装 dev-master 分支并将其声明为 1.1.2 版,Composer 可以解决两个包的依赖关系。

这样做的问题是,当您拥有三个依赖于第四个的包时它会失败 - 在三个不同的版本中。

正确的做法是让每个开发分支在 THEIR composer.json 中包含一个分支别名声明,这将允许 Composer 检测到 dev-master 分支实际上等同于版本 1.1.x,这可能会有所帮助这里(但如果任何包明确需要给定的版本号 - 1.1.x 不是 1.1.2)。添加分支别名仍然是一件好事,应该这样做。如果维护者想避免在composer.json 中持续维护这个硬编码版本别名,他们可以选择在一个以他们的名字命名的.x 版本的分支中开发那个版本(即“v1.1.x”或“1.1.x”。 x" 将被 Composer 检测到包含所述版本的开发稳定性)。

请注意,我在上一段中描述的问题是软件包明确需要给定的版本号。使用这种方法,如果您需要这样的包,您不能自己或在不同的包中使用该依赖包的不同版本。虽然可能存在只需要一个版本的情况,但更好的解决方案是要求版本范围。

我个人的偏好是对大于 1.0 的版本使用插入符运算符:^1.1.7 需要 1.1.7 作为最低版本,但不会更新到任何版本 2.0.0,这被认为具有不兼容的更改。如果一个包根据语义版本被仔细标记为新版本,这就像一个魅力。您永远不会对不兼容的更改感到惊讶(当然,除非是人性的干扰,但您应该能够检测到此故障并在您的软件出现故障时回滚更新)。

对于 1.0 以下的版本,请注意插入符运算符的工作方式与波浪号运算符不同 - refer to the manual for more details。即使语义版本控制允许 0.x 范围内的不兼容更新,我也更喜欢在我控制下标记为 0.x 的包以获取“兼容”功能更新。

但即使没有语义版本控制,版本号中的每一点不准确都会有所帮助,例如定义1.1.*(据说将更新到所有即将发布的错误修复版本)或>=1.1.2,<1.2.5

最糟糕的是需要“dev-master”。虽然这确实非常不准确(它将解决分支中任何可能的提交,具体取决于您更新的时间),但问题是您无法返回到以前版本的“dev-master”,除非您确切知道哪个提交您需要的 id 并将此要求添加到 composer.json。但是你的情况与上面完全相同,需要一个确切的版本(一个 git 标签只是一个提交 id 的命名别名)。

【讨论】:

那么我们如何使用分支别名呢? 我认为我的长回答应该解释它,但是如果它遗漏了一些东西,请提出更详细的问题。

以上是关于运行composer install时如何解决两个包需求冲突?的主要内容,如果未能解决你的问题,请参考以下文章

laravel根目录下如何解决在composer install时提示php版本需要更新?

开始使用chef,并在部署时运行composer install

如何从 php 容器中的 dockerfile 运行 composer install

临时解决执行 Composer Install 返回 Killed 的问题

运行composer install时出错执行\"'cache:clear --no-warmup'\"命令时出错:

laravel composer install 无法解决 tymon/jwt-auth 的可安装包