参考 - 升级PHP后Composer错误“Your PHP version does not satisfy requirements”

14
在将PHP从7.4更新到8.0后,我在现有项目上运行了composer update,并收到了以下错误:
  • acme/some-package[1.0.0, ..., 1.4.0]需要php ^5.6.4 || ^7.0 -> 您的PHP版本(8.0.3)不满足该要求。
这是什么意思,我该如何解决?

1
我认为这个已经足够作为参考了。这是我尝试用作所有这些“teh composer won't install!!1!”问题的重复目标的一个。 - yivi
1
@yivi 谢谢,我之前没有看到过这个。在两者之间进行交叉引用肯定是有用的,但我认为专注于这个特定情况的附加指南也很有价值。我们目前收到了很多关于升级到 PHP 8.0 的问题,因为这是大多数人在主要版本发布之前不会考虑到的限制。当 7.0 版本发布时,我发现了一堆类似的问题,它们目前没有被标记为任何重复内容,并且有些从未得到回答,所以我打算把它们都指向这里。(我只是还没有时间。) - IMSoP
4个回答

21
如果您正在使用 PHP 8 版本,则某些尚未支持的插件可能会导致安装错误。
使用以下命令: composer install --ignore-platform-req=php 或者 composer install --ignore-platform-reqs 此选项可用于设置Composer可以忽略的特定要求。

1
这个命令:composer install --ignore-platform-req=php 救了我的一天。 - Erich García
这终于对我起作用了。 - DANIEL
需要注意的是,只有在软件包实际上与新的PHP版本兼容时,这才能起作用 - 它并不会“修复”任何问题,只是表示“我想在未经测试的PHP版本上运行此软件包,自担风险”。 - IMSoP

15

问题

除了指定其他包版本外,Composer包还可以指定它们支持的PHP版本。

在解决要安装的软件包版本时,Composer必须找到符合以下所有约束条件的版本:

  • 您在composer.json中为依赖项指定的版本约束
  • 每个软件包已指定的依赖项版本约束
  • 每个软件包支持的PHP版本

如果没有软件包满足这些约束条件,则会出错。

常见的混淆

请注意,PHP版本的版本约束遵循其他composer约束的规则。因此,^7.0的约束意味着“7.x中任何版本都在7.0之上”,并且不包括8.0。

解决方案

要解决问题,您需要放松其中一个约束条件:

  1. 查看错误消息中提到的软件包(例如示例中的acme/some-package)并在Packagist(或您配置的任何自定义软件包源)中找到该软件包。
  2. 查看是否存在支持您的PHP版本的更新版本。
  3. 如果没有,请找出需要添加支持的内容。这可能意味着直接检查项目、运行其测试并提交修补程序以标记其与新版本兼容。
  4. 如果已添加了支持,则需要确保您的composer.json和其他依赖项不排除该新版本。例如,如果您当前依赖于acme/some-package版本^1.0,但是PHP 8.0仅从2.2.0版本开始受支持,则需要将约束更改为^2.2,并确保您的应用程序仍然兼容。

临时解决方法

有时候,您很确定应用程序将使用与先前使用的软件包相同的版本运行。在这种情况下,您可以使用 composer.json中的platform配置变量来假装您仍在使用旧版本。 这只应作为临时解决方法或测试时使用,因为这意味着可能会安装完全无法在新版PHP上运行的软件包。

例如:

{
    "config": {
        "platform": {
             "php": "7.4.999"
        }
    }
}

另请参见“如何在composer中覆盖PHP基础依赖项


我遇到了这个确切的问题,但据我理解,问题在于composer默认由较新版本的php(8)运行。如果我执行php7.4 $(which composer),它就可以正常工作。 我只希望composer脚本能够自动以与composer.json中相同的版本运行(如果有的话)。 我认为config>platform>php应该是用来做这件事的,但显然不是这样。 - sylbru
@Niavlys Composer脚本完全由PHP编写,因此在解析配置时选择不同的PHP可执行文件已经太晚了。并且,并行安装的不同版本的PHP也没有标准名称或位置——你知道有一个可用命令叫作"php7.4",但是Composer只运行/usr/bin/env php,它会获取当前环境中"php"代表的意义。如果想要改变这一点,请查阅文档以了解您的操作系统(Ubuntu/CentOS等)如何管理该symlink。 - IMSoP
@Niavlys 所有这些都说了,平台配置应该告诉Composer忽略当前运行的PHP版本,并安装适合配置版本的软件包。 - IMSoP
没错,这就是我想的,它无法猜测我的php可执行文件在哪里。我会看看env,也许我能想出一个聪明的方法来解决这个问题。 但还是谢谢,知道平台配置应该可以工作,不确定为什么在我的情况下不起作用... - sylbru
我刚刚通过一个简单的自定义shell脚本解决了我的问题,当执行composer时,它被称为而不是composer.phar。目前,它只检查我是否在主PHP 7.4项目中工作,并在这种情况下使用7.4运行composer.phar,在其他情况下使用PHP 8。我想可以通过使其读取composer.json来知道所需的PHP版本来进行泛化,但是PHP可执行文件的位置可能仍然是一个问题。对于我的个人使用,它非常完美! - sylbru

6
作为一个额外的提示:如果你想检查如何使你的项目兼容而不运行composer update,Composer提供了命令why-not。你不仅可以使用包及其版本来运行它:composer why-not vendor/package 2.0将列出阻止安装vendor/package v2.0的其他包版本。
这也适用于PHP本身:composer why-not php 8.0将告诉你哪些包阻止了使用更高版本的PHP。

1
“why-not” 真是救星。我们的生产代码已经上线,但从暂存到生产环境的版本略有不同,我们无法确定哪个包在抛出 PHP 版本错误。这个工具让我们快速缩小了范围。谢谢! - n0nag0n

0

手动在 composer.json 中更新 PHP 版本,然后运行以下命令:

composer update --with-all-dependencies

文档中写道:
更新参数列表中的包的依赖关系,包括根要求的依赖关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接