Composer - Установить автозагрузку в новом пакете - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь создать пакет 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):

  1. Создать новый файл класса, например: myhandle/mypackage/src/Test.php
  2. Затем я создаю его как это: $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 документации, как настроить его в новом проекте / пакете. Однако я могу найти базиллион руководств о том, как использовать автозагрузку.

1 Ответ

3 голосов
/ 13 июля 2020

As yivi и Daniel Protopopov указал:

Проверьте документацию на get composer .org относительно автозагрузки

Удалите собственное определение автозагрузчика, зарегистрируйте пространство имен в composer. json (надеясь, что вы уже следуете PSR-4), запустите composer dump-autoload.

И последнее, но не менее важное: когда и где угодно вам нужно его использовать, просто включите

require __DIR__ . '/vendor/autoload.php';
...