С помощью Composer легко и удобно подключать пакеты в приложениях PHP. Это замечательный инструмент.
Пишем команду composer require some-cool-guy/cool-package
и код скачивается и подключается в вашем приложении.
Но бывает так, что вам нужно изменить что-то в том пакете который вы скачиваете.
Зачем вносить исправления? 👀
-
Пакет давно не обновлялся, и указанные в нём зависимости устарели, а обновить их без участия автора пакета вы не можете — пакет не устанавливается;
-
Вы обнаружили ошибку, которую можно исправить только в коде пакета, опять же нужно участие автора пакета.
Конечно, можно отправить Pull Request с исправлениями и ожидать что автор примет ваши исправления. Или создать Issue и описать проблему, в надежде что автор сам исправит код.
Но это не всегда подходит:
-
Пакет может быть заброшен, автор может не отвечать на PR и Issue
-
Автор вполне может отклонить ваши правки, по любым собственным причинам
-
Вы не можете ждать, потому что ваши сроки ограничены
В этом случае рекомендуется сделать форк (fork — копию репозитория в GitHub) пакета и подключать собственный форк вместо оригинала.
Делаем форк и подключаем в проект
Столкнувшись с той же проблемой, я так и не смог найти работающий способ подключить форк через репозиторий GitHub. Не помог ни Гугл, ни эксперименты, ни отладочный режим запуска композера. 😕
Получилось добиться результата следующим способом:
-
Клонируем код пакета с репозитория GitHub в папку проекта.
cd my-project git clone https://github.com/some-cool-guy/cool-package.git
-
Указываем репозиторий в composer.json:
{ "repositories": [ { "type": "path", "url": "./cool-package" } ] }
-
Подключаем пакет, указывая версию “@dev” — композер подхватит код из локальной копии.
composer require "some-cool-guy/cool-package @dev"
При этом композер создаёт символьную ссылку в папке “vendor”, указывающую на наш код.
-
Правим код пакета, как нам угодно.
По сути, мы не сделали “настоящий форк” а только скопировали код. Этот способ не такой чистый как подключение форка Git-репозитория. Но он железно работает и не требует больших усилий.