原文:
https://discuss.flarum.org/d/24684
作者:
clarkwinkelmann
最近,新装 Flarum 出现了一个问题,我想就如何解决该问题提供一些指导。
鉴定问题
当您试图安装一个新的扩展时,您可能会收到 Composer 「Installation failed 安装失败」的报错。Composer 的输出会显示一些冲突信息,其中包括如下内容。
composer require fof/upload Using version ^0.10.0 for fof/upload
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for fof/upload ^0.10.0 -> satisfiable by fof/upload[0.10.0].
- Conclusion: remove guzzlehttp/guzzle 7.0.1
- Conclusion: don't install guzzlehttp/guzzle 7.0.1
- fof/upload 0.10.0 requires guzzlehttp/guzzle ^6.0 -> satisfiable by guzzlehttp/guzzle[6.0.0, 6.0.1, 6.0.2, 6.1.0, 6.1.1, 6.2.0, 6.2.1, 6.2.2, 6.2.3, 6.3.0, 6.3.1, 6.3.2, 6.3.3, 6.4.0, 6.4.1, 6.5.0, 6.5.1, 6.5.2, 6.5.3, 6.5.4, 6.5.5].
- Can only install one of: guzzlehttp/guzzle[6.0.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.0.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.0.2, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.1.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.1.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.2.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.2.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.2.2, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.2.3, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.3.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.3.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.3.2, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.3.3, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.4.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.4.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.2, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.3, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.4, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.5, 7.0.1].
- Installation request for guzzlehttp/guzzle (locked at 7.0.1) -> satisfiable by guzzlehttp/guzzle[7.0.1].
Installation failed, reverting ./composer.json to its original content.
原因
Composer 让每个扩展都可以请求他们选择的依赖软件包和依赖版本,然而并非所有的扩展都请求相同的依赖版本,这就是问题的所在。
在这种情况下,冲突其实是可以解决的,但 Composer 自己无法解决。
问题在于 league/oauth2-client
在 Guzzle ^6.0
或 ^7.0
版本下均可工作,而其他大多数扩展只能在 Guzzle ^6.0
下工作。
如果 league/oauth2-client
先被安装了,Composer 就会安装 7.0 版本的 Guzzle。如果您接着尝试安装需要 Guzzle 6.0 的扩展,Composer 就不会接受给已安装依赖降级它的主要版本。
league/oauth2-client
是作为 Facebook/GitHub
登录扩展的依赖安装的,当然也不限于提供登录功能的其他社区扩展。
我认为这个问题不会影响到所有人,因为通常还有另一个只需要 Guzzle 6 的扩展是默认安装的,就是依赖 league/oauth1-client
的 Twitter 登录扩展,它只能在 Guzzle 6 下工作。所以我相信每个遇到这个问题的人,一定是在某个时候卸载了 Twitter 登录扩展,然后运行了全局 Composer 更新。顺带一提,Flarum 核心并不需要 Guzzle。
这个问题是在最近才开始发生,因为 oauth2 客户端从 2020年7月18日 发布的 2.5.0 版本开始允许使用Guzzle。旧的 Flarum 安装版本,由于未更新这些扩展的依赖,使用的仍是 2.4.* 版本,因此不会产生这种冲突。
这个问题其实可以在 Composer 的问题跟踪器中找到:#7329 和 #8910。看上去这个问题好像在 Composer v2 中解决了,但是我还没有测试 v2。
解决办法
Composer 拥有选项命令(例如 --update-with-dependencies
)以允许进行依赖关系更新,但是在 Composer v1 中,这似乎不允许降级主要版本。所以解决方法如下:
步骤 1: 将 Guzzle ^ 6.0
安装为直接依赖,这强迫 Composer 把主版本 7 降到 6:
composer require guzzlehttp/guzzle:^6.0
Composer 会显示类似的内容 Downgrading guzzlehttp/guzzle (7.0.1 => 6.5.5)
。
步骤 2: 按照扩展发布帖中的说明安装当初无法安装的新包。例如 FoF Upload 文件上传器。
composer require fof/upload
步骤 3: 删除直接 Guzzle 依赖。这样可以避免将来可能出现的其他问题。
composer remove guzzlehttp/guzzle
Composer 会显示「Nothing to install or update」,就是这样子,我们只是从 composer.json
中删除关于 Guzzle 的行。您也可以手动删除该行,但运行该命令可以确保您不会删坏 composer.json
的格式。
本译文已得到官方授权,转载请务必注明文章译者、原文出处、和本文链接。