参考 - 升级 PHP 后 Composer 错误“您的 PHP 版本不满足要求”
Posted
技术标签:
【中文标题】参考 - 升级 PHP 后 Composer 错误“您的 PHP 版本不满足要求”【英文标题】:Reference - Composer error "Your PHP version does not satisfy requirements" after upgrading PHP 【发布时间】:2021-05-27 19:03:27 【问题描述】:在将 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) 不满足该要求。
这是什么意思,我该如何解决?
(这是一个参考答案,旨在涵盖一个经常遇到的问题。该场景只是一个示例。另请参阅:“How to explain Composer's error log?”)
【问题讨论】:
我认为this one 作为参考已经足够好了。这是我尝试将其用作所有这些“作曲家不会安装!!1!”的欺骗目标。问题。 @yivi 谢谢,我以前没见过那个。两者之间的交叉引用肯定会很有用,但我认为有一个额外的指南专注于这个特殊案例是有价值的。我们目前收到很多关于升级到 PHP 8.0 的问题,因为这是人们在主要版本发布之前通常不会考虑的限制。我从 7.0 出来时发现了一大堆类似的问题,这些问题目前没有被标记为重复任何内容,而且有些问题从未得到解答,因此打算将它们全部指向这里。 (我只是还没有时间。) 【参考方案1】:问题
除了它们需要的其他包的版本外,Composer 包还可以指定它们支持的 PHP 版本。
在解析要安装的软件包的版本时,Composer 必须找到与所有现有约束匹配的版本:
您在composer.json
中为依赖项指定的版本约束
每个包为其依赖项指定的版本约束
每个包支持的 PHP 版本
如果没有满足所有这些约束的包,你会得到一个错误。
常见的困惑
请注意,PHP 版本的版本约束遵循the same rules as other composer constraints。所以^7.0
的约束意味着“7.0 以上的任何 7.x 版本”,并且 不 包括 8.0。
解决方案
要解决问题,您需要放松其中的一个约束:
-
查看错误消息中提到的包(示例中为
acme/some-package
)并在Packagist(或您配置的任何自定义包源)上找到它。
查看是否存在支持您的 PHP 版本的更新版本。
如果没有,您需要了解添加该支持所需的内容。这可能意味着直接检查项目、运行测试并提交补丁以将其标记为与新版本兼容。
如果(何时)添加了支持,您需要确保您的composer.json
以及您依赖的其他软件包不排除该新版本。例如,如果您当前依赖 acme/some-package
版本 ^1.0
,但 PHP 8.0 仅从 2.2.0 版本开始支持,您需要将约束更改为 ^2.2
,并确保您的应用程序仍然兼容.
临时解决方法
有时,您很确定您的应用程序可以使用与您之前使用的相同版本的软件包正常运行。在这种情况下,您可以在composer.json
中使用the platform
configuration variable 来假装您仍在使用旧版本。 这只能作为临时解决方法或用于测试,因为这意味着将安装可能在您的新 PHP 版本上完全损坏的软件包。
例如:
"config":
"platform":
"php": "7.4.999"
另见“Override PHP base dependency in composer”
【讨论】:
我遇到了这个确切的问题,但据我了解,问题是作曲家默认由较新版本的 php (8) 运行。如果我这样做php7.4 $(which composer)
,效果很好。我只是希望作曲家脚本能够自动运行与 composer.json 相同的版本(如果有的话)。我认为 config>platform>php 是为了这样做,但显然不是。
@Niavlys Composer 脚本完全是用 PHP 编写的,所以当它解析您的配置时,选择不同的 PHP 可执行文件已经太迟了。并排安装的不同版本的 PHP 也没有标准名称或位置 - 您 知道您有一个名为“php7.4”的可用命令,但 Composer 只运行 /usr/bin/env php
无论“php”在您当前的环境中是什么意思。如果您想更改那个,请查找有关您的操作系统(Ubuntu / CentOS / 等)如何管理该符号链接的文档。
@Niavlys 话虽如此,平台配置应该告诉 Composer 忽略当前运行的 PHP 版本,并安装适合配置版本的软件包。
是的,这就是我的想法,它无法猜测我的 php 可执行文件在哪里。我去看看env
,也许我能想出一个聪明的方法来解决这个问题。但是谢谢,很高兴知道平台配置应该可以工作,不知道为什么在我的情况下它不起作用......
我刚刚用一个简单的自定义 shell 脚本解决了我的问题,而不是在执行 composer
时调用了 composer.phar
。现在,它只检查我是否在我正在处理的主要 PHP 7.4 项目中,并在这种情况下使用 7.4 运行 composer.phar,否则使用 PHP 8。我想它可以通过读取 composer.json 来了解所需的 PHP 版本来概括,但 PHP 可执行文件的位置可能会成为一个问题。不过对于我个人而言,它是完美的!【参考方案2】:
作为附加提示:如果您想检查如何在不运行composer update
的情况下使您的项目兼容,Composer 提供了命令why-not
。您不仅可以使用软件包及其版本运行它:composer why-not vendor/package 2.0
将列出阻止安装 vendor/package
的 v2.0 的所有其他软件包版本。
这也适用于 PHP 本身:composer why-not php 8.0
会告诉你哪些包阻止使用更高版本的 PHP
【讨论】:
why-not
是救生员。生产代码上线了,但从 staging 到 prod 的版本略有不同,我们无法确定哪个包引发了 php 版本错误。这真的很快缩小了范围。谢谢!【参考方案3】:
Composer 2.0 is now available!
附带说明一下,require/remove 和部分更新现在要快得多,因为 Composer 只会加载正在更改的包的元数据。
我注意到一个没有提供链接的回复。
希望对你有帮助
【讨论】:
我不确定这与这个问题有什么关系。是不是不小心发错地方了?【参考方案4】:如果您使用的是 PHP 8 版本,一些尚不支持的插件可能会导致安装错误。
composer install --ignore-platform-req=php
或 composer install --ignore-platform-reqs
此选项可用于设置作曲家可以忽略的特定要求。
【讨论】:
以上是关于参考 - 升级 PHP 后 Composer 错误“您的 PHP 版本不满足要求”的主要内容,如果未能解决你的问题,请参考以下文章
使用 Alpine 的 apk 命令安装 composer 时使用了错误的 PHP 版本
怎么把所有php5.6的composer依赖升级为php7.0的?