Я пытаюсь создать пакет composer, но мне не удается настроить автозагрузку для работы в проекте, в котором я его разрабатываю.
У меня два проекта:
- Project Foo (где я разрабатываю пакет).
- Project Bar (где я установил пакет:
composer require myhandle/mypackage
).
In Project Foo I (очевидно) также должен иметь возможность использовать этот пакет. Но настройка автозагрузки в моем собственном пакете не работает.
Однако ... Когда я фиксирую изменения в Github, обновляю пакет в Packagist и запускаю composer update
в панели проектов, он работает (? !).
И, как ни странно ... Если я сделаю composer update
из Project Foo (проект, в котором он не работает). Итак, обновление пакета до текущей версии (?) Заставляет его начать работать.
Значит, это должно быть каким-то образом связано с тем, как я настроил автозагрузку.
Примечание:
Я запустил пакет, создав новую (пустую) папку в каталоге поставщика, а затем собрал там пакет. Я подумал, что это было умно, так как тогда он отражал бы то, как бы он выглядел, если бы я composer required
пакет.
Я не знаю, является ли это плохой практикой, поскольку Composer больше не контролируются 'всех файлов в каталоге vendor.
Существует масса руководств о том, как создать пакет composer, но ни одно из них не объясняет, как хорошо структурировать файлы в проекте, где пакет в разработке.
Вот что я делаю, чтобы «получить ошибку» (в Project Foo):
- Создать новый файл класса, например:
myhandle/mypackage/src/Test.php
- Затем я создаю его как это:
$test = new MyNamespace\MyPackageName\Test();
И затем я получаю сообщение об ошибке:
Неустранимая ошибка: Неперехваченная ошибка: класс 'MyNamespace \ MyPackageName \ Test' не найден
И это то, что работает в Project Bar (тот самый код).
Я не могу найти руководство о том, как правильно настроить автозагрузку в пакете, который я разрабатываю. Я использую этот файл автозагрузки, который нашел в другом проекте composer. Я поместил его в root своего проекта. Это выглядит так:
<?php
namespace MyNamespace\MyPackageName;
spl_autoload_register(function($cls) {
$cls = ltrim($cls, '\\');
if (strpos($cls, __NAMESPACE__) !== 0) {
return;
}
$classWithoutBaseNamespace = str_replace(__NAMESPACE__, '', $cls);
// Load files from 'src' directory based on their class name without
// the StoutLogic\AcfBuilder namespace.
$path = dirname(__FILE__).
DIRECTORY_SEPARATOR.
'src'.
str_replace('\\', DIRECTORY_SEPARATOR, $classWithoutBaseNamespace).
'.php';
require_once($path);
});
Я не могу найти его в Composer документации, как настроить его в новом проекте / пакете. Однако я могу найти базиллион руководств о том, как использовать автозагрузку.