为什么 Composer (PHP) 允许我在“composer require”期间指定“ext-json”而不是其他扩展,如“ext-gmp”?

问题描述 投票:0回答:2

当我使用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-extension
2个回答
0
投票

有两个向 php 应用程序添加功能的概念

  • 通过作曲家安装包。这可以是用 PHP 编写的任何库或框架
  • 通过安装扩展来扩展 PHP 本身的功能

PHP 是用 C 语言编写的,具有扩展核心语言功能的能力。这些扩展通常是用 C 语言编写的,您可以将它们算作语言的“插件”或“模块”。你需要重新编译 PHP 才能使它们工作

在 php 中有一些开箱即用的扩展——比如你提到的 json 扩展。它允许 php 使用 jsons 还有更多。例如让 PHP 处理图像或 zip 文件。或使用调试器(xdebug - 你绝对应该尝试一下!)

composer 是 php 包管理器。它不能改变 PHP 本身。所以你不能通过作曲家添加扩展。只有 PHP 包

但是 composer 可以验证您的 PHP 是否具有应用程序所需的扩展。如果您的 PHP 中缺少此扩展名,这行

"ext-json": "*"
将告诉作曲家警告您。但是
ext-json
已经存在于任何现代 PHP 版本中。所以这张支票没用

我从未尝试过

ext-gmp
但我猜它不包含在核心 PHP 中。所以你应该另外安装它。并添加
"require": "ext-gmp"
只是为了确保您或您的同事不会忘记自己安装该扩展程序


0
投票

与其他扩展相比,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 安装无关。

© www.soinside.com 2019 - 2024. All rights reserved.