Как обновить только одну зависимость в Composer?
Проблема с обновлением зависимости в Composer
Я ожидал, что команда
composer update videlalvaro/php-amqplib
обновит только одну зависимость, но вместо этого она обновляет все зависимости.
Что я упускаю?
P.S.: Эта зависимость в моем файле composer.json
определена как "videlalvaro/php-amqplib": "2.2.0"
.
P.P.S.: Используемая версия Composer: 3da05c68f9561fa822c522b1815435ff990493ff 2013-10-02 14:25:06
.
P.P.P.S.: Вот актуальный вывод команды:
$ composer.phar update videlalvaro/php-amqplib --no-dev
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.
Problem 1
- symfony/icu v1.2.0 requires lib-icu >=4.4 -> the requested linked library icu has the wrong version installed or is missing from your system, make sure to have the extension providing it.
- symfony/icu v1.2.0 requires lib-icu >=4.4 -> the requested linked library icu has the wrong version installed or is missing from your system, make sure to have the extension providing it.
- Installation request for symfony/icu == 1.2.0.0 -> satisfiable by symfony/icu[v1.2.0].
Как я могу решить эту проблему и обновить только указанную зависимость?
4 ответ(ов)
Команда composer update videlalvaro/php-amqplib
обновляет только эту зависимость. Однако она не отключает проверку зависимостей, которую выполняет Composer.
Ошибка, о которой идет речь, связана с отсутствием библиотеки lib-icu в вашей системе. По всей видимости, это можно решить, установив расширение PHP Intl.
Вы столкнетесь с подобными проблемами, если выполните composer update
в проекте, который требует PHP 5.5 в одном из его зависимостей, затем понизите версию PHP до 5.4 и проведете composer update
у другой зависимости, которая не требует PHP 5.5. Хотя вы не обновляете зависимость, нуждающуюся в PHP 5.5, требования для этого пакета не смогут быть разрешены, и Composer завершит работу с ошибкой.
В вашем случае, несмотря на то что вы пытаетесь обновить только videlalvaro/php-amqplib
до последней версии, не выполнены требования для symfony/icu
, и, следовательно, обновление не удается.
Правка
Чтобы помочь вам, я предполагаю, что вы переустановили PHP с момента последнего обновления и либо удалили, либо забыли установить расширение PHP Intl. Composer не может удовлетворить требования вашего composer.json
, поэтому он по умолчанию не выполняет никаких действий, вместо того чтобы сознательно проводить обновление, когда требования не выполнены.
В общем, вам нужно установить необходимые расширения PHP, чтобы ваше существующее программное обеспечение могло работать, и тогда Composer сможет обновить именно тот пакет, который вы хотите, а также удовлетворить требования для других пакетов.
кратко:
Вы можете обновить более одной зависимости в одной команде:
composer update one/dependency second/dependency other/dependency
Подробности:
Когда вы хотите обновить только одну зависимость (например, composer update some/dependency
), вы можете столкнуться с проблемой, что запрос не может быть удовлетворён из-за того, что какая-то другая зависимость установлена в неверной версии. Эта зависимость не обязательно должна быть указана в вашем composer.json
, она может быть зависимостью другой зависимости.
Например, я хотел обновить только google/apiclient
, но вызов composer update google/apiclient
выдал сообщение, что google/auth
(зависимость apiclient) требует guzzlehttp/psr7
версии 1.2.3
. У меня была установлена версия 1.3.0
. guzzlehttp/psr7
не была указана в моём composer.json
. Всё, что мне нужно было сделать, это вызвать:
composer update guzzlehttp/psr7 google/apiclient
И всё! Просто обновите нужный пакет, и если composer сообщает вам, что нужно обновить (или понизить 😃) какую-то другую зависимость, укажите её в команде.
Чтобы избежать проблемы с зависимостями при обновлении конкретного пакета, вам следует заранее указать версии всех необходимых пакетов перед тем, как выполнять их обновление.
В вашем случае можно сделать следующее:
composer require videlalvaro/php-amqplib:2.2.0 --no-update
composer require symfony/icu:1.2.0 --no-update
composer require lib-icu:4.4 --no-update
composer update videlalvaro/php-amqplib symfony/icu lib-icu
Таким образом, вы сможете успешно обновить нужные пакеты, не сталкиваясь с проблемами зависимостей.
У меня была похожая ситуация по причинам безопасности на репозитории GitHub.
Я решил проблему, обновив зависимость до конкретной версии следующим образом:
composer require phpseclib/phpseclib:2.0.31
Если вы работаете с виртуальными окружениями, такими как контейнеры Docker (например, ddev, lando и т.д.), перед выполнением этой команды вам нужно подключиться к контейнеру с помощью:
ddev ssh
Как удалить пакет из Laravel с помощью PHP Composer?
Как установить конкретную версию пакета с помощью Composer?
Composer/Packagist не удалось найти пакет с минимальной стабильностью
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?