Почему Composer (PHP) позволяет мне указать «ext-json», но не другие расширения, такие как «ext-gmp», во время «требования композитора»?

Когда я использую 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

Composer не может устанавливать расширения. Вероятно, это просто говорит, установлено ли расширение уже, когда вы пытаетесь это сделать. ext-json вообще всегда присутствует в PHP трудно его не иметь

apokryfos 30.03.2023 23:44

Ах, это имеет смысл. Мне пришлось бы настроить другие системы или поиграть с некоторыми контейнерами Docker, чтобы собрать установку PHP, в которой отсутствует расширение ext-json, если бы я хотел увидеть это в действии. Но я также могу поверить вам на слово. Когда я смотрю на документы Composer, в них есть раздел о «пакетах платформ», который является единственной частью документов, в которой упоминается фраза «ext-» (getcomposer.org/doc/01-basic-usage.md#). платформенные пакеты). Итак, может быть, они не задокументировали то поведение, свидетелем которого я был?

Matt Welke 30.03.2023 23:49

Я только что попробовал кое-что сам, чтобы подтвердить то, что вы описали. Вы совершенно правы. Я использую Ubuntu, поэтому правильной командой для моей конкретной версии PHP для установки расширения была sudo apt-get install php8.1-gmp. Я запустил это, затем запустил php -m | grep gmp и отметил, что тогда я впервые увидел gmp как вывод этой команды. И затем, когда я запустил composer require ext-gmp, я не получил ошибку, и расширение было отмечено в composer.json и composer.lock так же, как ext-json.

Matt Welke 30.03.2023 23:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

есть две концепции добавления функциональности в ваше php-приложение

  • установить пакет через composer. это может быть любая библиотека или фреймворк, написанный на PHP
  • расширить функциональность самого PHP, установив расширение

PHP написан на C и имеет возможность расширять функциональность основного языка. эти расширения обычно написаны на C, и вы можете считать их «плагинами» или «модулями» для языка. вам нужно перекомпилировать PHP, чтобы заставить их работать

в php есть несколько готовых расширений, например расширение json, о котором вы упоминали. это позволяет php работать с jsons и многое другое. например, заставить PHP работать с изображениями или zip-файлами. или использовать отладчик (xdebug - обязательно попробуйте!)

composer — это менеджер пакетов php. он не может изменить сам PHP. поэтому вы не можете добавлять расширения через composer. только пакеты PHP

но композитор может убедиться, что у вашего PHP есть расширения, необходимые вашему приложению. эта строка "ext-json": "*" скажет композитору предупредить вас, если это расширение отсутствует в вашем PHP. но ext-json уже есть в любой современной версии PHP. так что эта проверка бесполезна

я никогда не пробовал ext-gmp, но я думаю, что это не включено в ядро ​​PHP. поэтому вы должны установить его дополнительно. и добавьте "require": "ext-gmp", чтобы убедиться, что вы или ваши коллеги не забудете установить это расширение самостоятельно

Спасибо за публикацию. Хотя я не думаю, что это имеет отношение к моему вопросу. Я смог узнать о расширениях PHP и о том, как Composer можно использовать как для установки пакетов PHP, так и для составления списка требований к расширениям. Мой вопрос был о том, почему эти два расширения обрабатывались по-разному, когда я запускал команду composer require. Я хотел знать, есть ли что-то особенное в расширении ext-json по сравнению с другими.

Matt Welke 31.03.2023 18:29
Ответ принят как подходящий

В расширении 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, которая в конечном итоге будет запускать код моего проекта.

Другие вопросы по теме