当我使用Composer运行composer require ext-gmp
时,在当前目录中没有composer.json
文件或composer.lock
文件,我会得到以下错误:
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).
基于我对PHP扩展和Composer的理解,这对我来说是有意义的。您不会使用Composer来安装扩展。它们被全局安装在系统上。Composer仅适用于PHP包。
然而,我注意到,如果我重复前面的步骤并运行composer require ext-json
,我会得到以下输出:
./composer.json has been created
Running composer update ext-json
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Writing lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files
No installed packages - skipping audit.
在这一点上,我有一个composer.json
文件,看起来像这样:
{
"require": {
"ext-json": "*"
}
}
我有一个composer.lock
文件,看起来像这样:
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "93d2b466348eca908189088d43f9fb1a",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"ext-json": "*"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
}
我觉得这很奇怪。看起来Composer在composer.json
和composer.lock
中创建的条目对于您希望指示您的项目需要在系统上安装ext-json
时是正确的。到目前为止,除了ext-json
和ext-gmp
之外,我还没有尝试过其他扩展,以发现Composer将允许您在composer.json
和composer.lock
中标记为系统需求的更多扩展,比如ext-json
。
ext-json
有什么特别之处,使它能以这种方式与Composer协同工作?
当我搜索这个问题是否已经得到回答时,我发现了这个问题,询问者想知道Composer为什么不能为他们安装扩展。这与我的情况不同。在这里,我知道Composer不是用来安装PHP扩展的工具,因此我理解composer require ext-gmp
的错误消息告诉我的是什么。但我想知道为什么Composer为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
向php应用程序添加功能有两个概念
- 通过composer安装软件包。这可以是用PHP编写的任何库或框架
- 通过安装扩展插件实现PHP自身的extand功能
PHP是用C语言编写的,能够扩展和核心语言功能。这个扩展通常是用C编写的,你可以把它们算作"C";插件";或";模块";语言。你需要重新编译PHP以使它们在中工作
在您提到的类似php的json扩展中,有一些开箱即用的扩展。它允许php使用jsons还有更多。例如,让PHP处理图像或zip文件。或者使用调试器(xdebug-你应该尝试一下!)
composer是php包管理器。它不能改变PHP本身。所以你不能通过composer添加扩展。只有PHP包
但是composer可以验证您的PHP是否具有应用程序所需的扩展。如果PHP中缺少此扩展,"ext-json": "*"
将告诉composer警告您。但是CCD_ 19已经存在于任何现代PHP版本中。所以这个检查是无用的
我从未尝试过ext-gmp
,但我想它没有包含在核心PHP中。所以你应该另外安装它。添加"require": "ext-gmp"
只是为了确保你或你的同事不会忘记在他们自己的上安装该扩展
ext-json扩展与其他允许它在composer.json
和composer.lock
中列出的扩展相比没有什么特别之处,而其他扩展则没有。
我不知道composer require
不仅仅是管理您的本地项目。当您使用它添加依赖项时,它还会检查您的系统。在我的情况下,当我运行composer require ext-json
时,它检查了我的系统,看看我是否已经安装了扩展。因为我这样做了,它没有出错,并且继续完成本地项目管理任务(编辑composer.json
和composer.lock
以添加它)。但是,当我运行composer require ext-gmp
时,它发现我还没有安装那个扩展,而且它很早就出错了,没有做任何与本地项目管理相关的事情。
我实际上并不需要这个系统检查功能,但如果我需要的话,解决方案就是安装扩展。我能够通过运行sudo apt-get install php8.1-gmp
对此进行测试。在那之后,运行composer require ext-gmp
并没有出错,并导致我的composer.json
和composer.lock
文件被编辑以将其包含在所需的扩展名列表中。
总之,我的解决方案包括现在理解Composer至少做两种类型的任务:
- 允许您根据所需的PHP版本和扩展指定项目的依赖项和系统要求
- 当您试图更改项目的系统要求时,请检查您正在使用的系统,看看该系统是否能够满足新的要求,至少在扩展方面是这样
在开发时,我必须记住这第二点,因为我正在将PHP代码部署到云平台上,所以我的计算机的PHP安装与最终运行我的项目代码的PHP安装无关。