Иногда бывает нужно временно поправить баг или опечатку в стороннем пакете composer
. Попробуем найти решение.
Проблема
Есть у нас зависимость от какого-то пакета. Среди файлов этого пакета (внутри vendor
) мы нашли баг/опечатку, который
мешает нам “жить” 🙂. А тут у нас еще и CI теперь есть, и все что было поправлено локально (внутри vendor
) в нее не
попадет. Тут мы начинаем думать…
Решения
Мы можем “подменить” реализацию из пакета на свою. Для этого мы находим проблемный класс, пускай это будет файл:
|
|
Нужно скопировать его куда-то в свой проект, пускай это будет папка overrides
в корне проекта (или где-то еще,
положение не принципиально, но лучше что бы она была вне psr-autoload
папок).
Теперь в composer.json
внутри autoload
создаем
свойство exclude-from-classmap
(ссылка на документацию)
в виде списка исключений и указываем наш файл там. Так же не забываем добавить пусть к нашему “исправленному файлу” в
папке overrides
:
|
|
Важно отметить: namespace
в исправленном файле должен остаться прежним, при этом название файла может не
совпадать с оригиналом, ведь мы напрямую подгружаем файл. Итого класс имеет “оригинальный” namespace и имя класса, и при
потребности его использовать он уже окажется загружен, без необходимости поиска его через psr-autoload
.
Дополнительно
Так как этот баг/опечатка могут оказаться не найденными долгое время, лучше добавить issue для мейнтейнера пакета. А еще
лучше конечно правильно оформленный PR 😉. Ведь ссылку хоть на issue, хоть на PR можно будет добавить в виде комментария
в файл внутри overrides
, что бы пришедший после разработчик понял “зачем тут это все” и поправил когда в основной
пакет “долетит” фикс.