Когда я использую 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
Ах, это имеет смысл. Мне пришлось бы настроить другие системы или поиграть с некоторыми контейнерами Docker, чтобы собрать установку PHP, в которой отсутствует расширение ext-json, если бы я хотел увидеть это в действии. Но я также могу поверить вам на слово. Когда я смотрю на документы Composer, в них есть раздел о «пакетах платформ», который является единственной частью документов, в которой упоминается фраза «ext-» (getcomposer.org/doc/01-basic-usage.md#). платформенные пакеты). Итак, может быть, они не задокументировали то поведение, свидетелем которого я был?
Я только что попробовал кое-что сам, чтобы подтвердить то, что вы описали. Вы совершенно правы. Я использую Ubuntu, поэтому правильной командой для моей конкретной версии PHP для установки расширения была sudo apt-get install php8.1-gmp. Я запустил это, затем запустил php -m | grep gmp и отметил, что тогда я впервые увидел gmp как вывод этой команды. И затем, когда я запустил composer require ext-gmp, я не получил ошибку, и расширение было отмечено в composer.json и composer.lock так же, как ext-json.






есть две концепции добавления функциональности в ваше 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 по сравнению с другими.
В расширении 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, которая в конечном итоге будет запускать код моего проекта.
Composer не может устанавливать расширения. Вероятно, это просто говорит, установлено ли расширение уже, когда вы пытаетесь это сделать.
ext-jsonвообще всегда присутствует в PHP трудно его не иметь