Конфликт при установке из composer.lock

Приветствую читателей своего блога (и себя из будущего, конечно же). Сегодняшняя статья будет короткой и речь в ней пойдет о проблеме в популярной системе контроля зависимостей для php – composer. Строго говоря это не проблема, а задокументированная фича, просто до недавнего времени работала она по-другому. Ну и да, далеко не все вообще читают эту документацию.

Composer часто ставится на компьютер и воспринимается как некая неизменяемая системная программа вследствие чего долго не обновляется (часто, например, вы обновляете git или putty на компьютере руками?). При работе с такими программами может возникнуть ситуация, при которой все отлично работает годами без каких-либо обновлений, однако когда инструмент все-таки обновляется или код переносится на другую машину, где новая версия утилиты. И тут происходит нежданчик. Именно такое постигло меня при обновлении версии composer в коробке vagrant. Да-да, сегодня все используют docker, но проект старый. Новая версия пакетного менеджера просто отказалась ставить зависимости из файла composer.lock, мотивируя это тем, что не может подобрать комбинацию пакетов под запросы пользователя.

Проблема возникает в случае, если в composer.lock указана N версия пакета, который фигурирует в секции replace другого пакета с версией M, где N > M. Описание может показаться неясным, поэтому я поясню его наглядно. Вот что написано в composer.lock по поводу var-dumper:

"name": "symfony/var-dumper:,
"version": "v3.4.1"
Наша symfony имеет конкретные пожелания по версиям пакетов.

То есть версия пакета var-dumper зафиксирована в 3.4.0, тогда как symfony установлена 3.3.18 и пакет var-dumper ожидает увидеть в той же версии, которую имеет сама.

Что же не так?

Раньше, до релиза 1.7.3, который вышел 1 ноября 2018 года, это отрабатывало “корректно” и все-таки ставился пакет указанной нами версии. Теперь же это стало выдавать ошибку, указанную выше. Разумеется слово “корректно” взято в кавычки, потому что ошибка это более правильный способ разрешить такую ситуацию. Вообще странно, что это не было сделано сразу, раз уж такая функциональность планировалась. Ну что можно ожидать от тулзы, которая называется composer (англ. – композитор), а на заставке у нее дирижер (conductor). Немного непоследовательности еще никому не вредило 🙂

С деталями изменений можно ознакомиться в диффе ну а я просто приведу фрагмент, который на мой взгляд достаточно полно отражает изменения в процессе выбора версии пакета.

Предыдущая версия.
Новая версия. Обратите внимание на комментарии к тесту.

Лечение данной проблемы очень простое (если конечно у вас нет критической логики, которая завязана на конкретных версиях пакетов). Необходимо подключить конфликтный пакет той версии, которая ожидается блоком replace. На этом сегодня все! Будьте внимательны со своими зависимостями 🙂