Я просто создавал один из моих первых пакетов PHP с использованием Composer, и я столкнулся с проблемой.
В настоящее время я работаю над пакетом, который его основной класс расширяет класс из другого пакета, так что на моем composer.json
У меня есть пакет, который я расширяю, объявленный как требование:
"require": {
"php": ">=5.3.0",
"ext-mbstring": "*",
"author/BasePackage": "dev-master"},
И, если я выпущу composer update
Я получаю хороший vendor
каталог внутри моего проекта с author/BasePackage
Зависимость скачана там.
Итак, мой вопрос в моем файле основного класса src\Extended.php
Мне нужно вручную сделать что-то вроде require_once __DIR__ . "/../vendor/autoload.php";
для того, чтобы автозагрузить BasePackage
так что я могу сделать class Extended extends \BasePackage\BasePackage
,
Это нормально? Как я должен загрузить свои зависимости пакета? Когда я фиксирую этот пакет на GitHub или около того, я игнорирую vendor
каталог и если кто-то использует это, требуя его в своих проектах require_once __DIR__ . "/../vendor/autoload.php";
потерпит неудачу, потому что это не будет там, где я ожидал.
Как мне это сделать?
Спасибо.
Нет, это не хорошо.
Вы можете смело предполагать, что любой, кто использует ваш пакет, использует Composer. И он будет использовать автозагрузчик Composer. Таким образом, он может загружать как ваш собственный класс из пакета, так и любой другой класс, от которого зависит ваш пакет, при условии, что вы перечислили его как зависимость в своем пакете.
Не загружайте вручную другие классы! Вам не нужно.
Ваши тесты в вашем пакете должны включать vendor/autoload.php
в начальной загрузке — это позволит вашему классу быть непосредственно используемым, потому что другие классы пакетов также могут быть автоматически загружены. Любые примеры сценариев должны также включать созданный автозагрузчик.
Если ваш пакет используется где-то еще, этот автозагрузчик будет действовать так же: все классы, которые Composer удастся загрузить и которые имеют правильное объявление автозагрузки, могут использоваться непосредственно после включения автозагрузчика.
Других решений пока нет …