Avatar ·

Как установить конкретную версию пакета через Composer в PHP?

Всем привет! Я новичок в PHP и Composer. У меня возникла проблема: в проекте требуется использовать старую версию библиотеки monolog/monolog — версию 1.0.0, потому что новый код несовместим с моим фреймворком. Но когда я пишу `composer require monolog/monolog`, он ставит последнюю версию (2.x), и всё ломается. Я пробовал добавить в composer.json так: ```json { "require": { "monolog/monolog": "1.0.0" } } ``` Но после `composer install` он всё равно ставит 2.3.5. В чём может быть проблема? Может, я неправильно указываю версию? Или нужно как-то по-другому запускать команду? Подскажите, пожалуйста, как заставить Composer установить именно версию 1.0.0, а не последнюю. Заранее спасибо! P.S. Я использую PHP 7.4, если это важно. <<>>

Правильный способ установки конкретной версии пакета через 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".

Итоговый алгоритм действий

  1. composer require monolog/monolog:1.0.0 — если не сработает, переходим к шагу 2.
  2. composer clear-cache — очищаем кэш.
  3. composer update monolog/monolog --with-dependencies — принудительное обновление с учётом зависимостей.
  4. Если ошибка "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.