为何Composer允许指定ext-json却无法指定ext-gmp等其他扩展?
当在无composer.json和composer.lock的目录执行composer require ext-gmp时,会触发如下报错:
Could not find a matching version of package ext-gmp. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stability (stable).
但执行composer require ext-json却能成功生成配置文件,composer.json内容如下:
{ "require": { "ext-json": "*" } }
composer.lock也会在platform字段记录该依赖。两者的差异根源在于PHP扩展的类型区分:
ext-json是PHP核心内置扩展
从PHP 5.2版本开始,ext-json就作为PHP核心的一部分默认编译并启用,除非在编译PHP时手动添加--disable-json参数刻意关闭。Composer识别这类核心默认存在的扩展,允许直接将其加入依赖声明,无需检测当前环境是否安装(因为默认就有),所以require操作会成功。ext-gmp是PHP可选扩展
gmp属于需要额外安装的可选扩展,默认不会随PHP基础包一起部署(比如Ubuntu下需要单独安装php8.1-gmp包)。Composer处理这类扩展时,会检查当前运行环境是否已安装该扩展:如果未安装,又没有指定明确的版本约束,Composer无法确认该扩展的可用性,就会抛出找不到匹配版本的错误。
补充验证:如果你的环境已经安装了gmp扩展,执行composer require ext-gmp同样会成功,此时Composer能检测到扩展存在,会将其加入依赖并更新lock文件的platform配置。反之,若你编译PHP时禁用了ext-json,composer require ext-json也会触发类似的报错。
系统信息参考:
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy $ php --version PHP 8.1.2-1ubuntu2.11 (cli) (built: Feb 22 2023 22:56:18) (NTS) Copyright (c) The PHP Group Zend Engine v4.1.2, Copyright (c) Zend Technologies with Zend OPcache v8.1.2-1ubuntu2.11, Copyright (c), by Zend Technologies $ composer --version Composer version 2.5.1 2022-12-22 15:33:54
内容的提问来源于stack exchange,提问作者Matt Welke

