Как установить конкретную версию пакета через Composer в PHP?
Правильный способ установки конкретной версии пакета через Composer
Проблема в том, что вы, скорее всего, не обновили composer.lock или используете неправильный синтаксис для указания версии. Вот как это делается правильно.
Способ 1: Установка через команду require (рекомендуется)
Самый простой способ — указать версию прямо в команде composer require:
composer require monolog/monolog:1.0.0
Или с пробелами (но это менее надёжно):
composer require monolog/monolog 1.0.0
Эта команда добавит запись в composer.json и сразу установит указанную версию, обновив composer.lock.
Способ 2: Ручное редактирование composer.json
Если вы уже отредактировали composer.json вручную, как в вашем примере, то после этого нужно выполнить:
composer update monolog/monolog
Обратите внимание: composer install не обновляет уже установленные пакеты. Он читает composer.lock и устанавливает те версии, которые там прописаны. Если в composer.lock уже была версия 2.3.5, то composer install просто установит её снова. Команда composer update пересчитывает зависимости и обновляет composer.lock.
Почему могла возникнуть ваша проблема?
- Кэш Composer: Старые версии могли закэшироваться. Очистите кэш:
composer clear-cache. - Ограничения PHP: Вы упомянули PHP 7.4. Проверьте, поддерживает ли версия 1.0.0 вашу версию PHP. Если нет, Composer может тихо установить более новую версию, совместимую с PHP 7.4. Для проверки используйте:
composer show monolog/monolog 1.0.0— если пакет не найден, значит версия недоступна. - Конфликты зависимостей: Другие пакеты в вашем проекте могут требовать более новую версию monolog. Composer пытается удовлетворить все зависимости, поэтому может проигнорировать ваше указание. Решение: обновить все зависимости или временно отключить конфликтующий пакет.
Проверка установленной версии
После установки проверьте, какая версия реально стоит:
composer show monolog/monolog
Или посмотрите в файл composer.lock — найдите секцию с monolog и проверьте поле "version".
Итоговый алгоритм действий
composer require monolog/monolog:1.0.0— если не сработает, переходим к шагу 2.composer clear-cache— очищаем кэш.composer update monolog/monolog --with-dependencies— принудительное обновление с учётом зависимостей.- Если ошибка "package not found" — значит версия 1.0.0 не существует или несовместима с вашим PHP. Используйте
composer show monolog/monolog --allдля просмотра всех доступных версий.
Если ничего не помогает, проверьте composer.json на наличие других пакетов, которые могут блокировать установку нужной версии. Удачи!
Альтернативный подход: использование composer.json с точным указанием версии
Если вам нужно зафиксировать версию надолго и избежать случайных обновлений, используйте точное указание (без диапазонов):
{
"require": {
"monolog/monolog": "1.0.0"
}
}
Затем выполните:
composer install --no-dev
Флаг --no-dev исключает dev-зависимости, что ускоряет установку. Если же вы хотите обновить только этот пакет, используйте:
composer update monolog/monolog --lock
Ключ --lock обновляет только composer.lock, не трогая другие зависимости.
Дополнительный совет: используйте версионирование в стиле SemVer
Для больших проектов рекомендую указывать версию с оператором ~ или ^, чтобы разрешить minor-обновления, но запретить major:
{
"require": {
"monolog/monolog": "~1.0.0"
}
}
Это установит любую версию от 1.0.0 до 1.0.x, но не 1.1.0 или 2.0.0. Так вы получите исправления багов без риска сломать совместимость.
Проверка совместимости
Если версия 1.0.0 не устанавливается из-за PHP, попробуйте более новую из ветки 1.x, например:
composer require monolog/monolog:1.27.1
Она поддерживает PHP 7.4 и выше, и при этом не ломает обратную совместимость с кодом, написанным под 1.0.0.