Анализируем проблему
Проблема при установке зависимостей без Composer - это система автозагрузки.
Composer использует самодельный автозагрузчик на основе карты массивов, это стандарт де-факто. Но эта система автозагрузки, к счастью в данном случае, не совместима с PSR-4.
PSR-4 - это стандарт de-iure для автозагрузки класса в PHP, поэтому вы не можете избежать автозагрузки. Вы должны использовать один из них.
Предложение решения
В этом случае этот великолепный автозагрузчик PSR-4 можно настроить вручную. для автоматической загрузки VendorClass
в VendorNamespace
в любом месте вашего кода, если вам нужен пользовательский autoload.php
файл на ранней стадии исходного кода.
Пример из реальной жизни
Давайте посмотрим на этот пример: у меня есть устаревший проект, который не может и не будет использовать Composer никогда и никогда, даже если Бог позволит это чудом. Этот проект можно ускорить с помощью этого фантастического пакета для сценариев командной строки. Это структура каталогов моего проекта:
- src
- tests
- vendor (not the Composer's one)
Этот пакет имеет следующую структуру каталогов:
- examples
- src
- Commando
- tests
Единственное, что мне нужно, это папка src
. Поместить эту папку в папку моего поставщика было бы нормально. Итак, мой пользовательский автозагрузчик будет таким:
// Constants
$base_path = "path\to\my\project";
$autoloader_class = '\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';
define("BASE_PATH", str_replace("\\", DIRECTORY_SEPARATOR, $base_path));
// Autoloader
require_once BASE_PATH.'\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';
// Init the autoloader.
$package = [
"nategood\commando" => [
"namespace" => "Commando",
"path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\nategood\commando\src\Commando')
],
"kevinlebrun\colors.php" => [
"namespace" => "Colors",
"path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\kevinlebrun\colors.php\src\Colors')
]
];
// Register namespaces.
$loader = new \PSR4\Psr4AutoloaderClass;
$loader->register();
// Namespace // Path to source
$loader->addNamespace($package["nategood\commando"]["namespace"], BASE_PATH.$package["nategood\commando"]["path"]);
$loader->addNamespace($package["nategood\commando"]["namespace"], BASE_PATH.$package["nategood\commando"]["path"]."\Util");
$loader->addNamespace($package["kevinlebrun\colors.php"]["namespace"], BASE_PATH.$package["kevinlebrun\colors.php"]["path"]);
Теперь я могу использовать пакет команд в любом месте моего проекта!
За и против
Это решение позволяет:
- Легко и вручную создайте свой собственный пользовательский автозагрузчик (вам нужно только указать
VendorNamespace
и папку (и), где искать VendorClass
es в VendorNamespace
.
- Свободно организуйте зависимость от композитора в любом месте папки проекта (а почему бы и нет, вне ее)
- Импортируйте пакет композитора, как он есть в вашем проекте (либо загрузка локально с помощью Composer, либо клонирование репозитория пакетов) или его соответствующую часть (например, удаление файла composer.json или файлов, для которых требуется автозагрузчик композитора).
Минусы:
- Создание собственного автозагрузчика вручную означает работу над всеми необходимыми зависимостями вашего проекта (надеюсь, не очень).
- Ошибки в путях к исходным файлам пакетов могут быть утомительными и неприятными.
- Работает только с именами файлов, совместимыми с PSR-4 (т. Е. Не может использовать имя файла
A.class.php
)
30.11.2020