Пространство имен моего пакета композитора не отображается в файле autoload_psr4

Я создаю свой первый пакет композитора. Я тестирую его, втягивая его в ванильный проект Laravel.

Проблема, с которой я сталкиваюсь, заключается в том, что когда мне требуется мой пакет композитора в основном файле Laravel composer.json, а затем я пытаюсь обновить автозагрузку.

Мой пакет composer.json:

{
    "name": "cschmitz/l5-simplefm",
    "description": "A Laravel 5 wrapper for Soliant Consulting's SimpleFM package.",
    "require": {
        "soliantconsulting/simplefm": "3.0.*"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "cschmitz",
            "email": "[email protected]"
        }
    ],
    "minimum-stability": "dev",
    "autoload": {
        "psr-4": {
            "L5SimpleFM\\": "src/"
        }
    }
}

Структура папок моего пакета в папке vendor проекта Laravel:

структура папок поставщика

Composer.json моего проекта Laravel:

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
        "cschmitz/l5-simplefm": "dev" // Requiring my package here
    },
    ...

После этого я выполнил composer dump-autoload. Я не получаю никаких ошибок от композитора, но когда я проверяю свой файл vendor/composer/autoload_psr4.php, мое пространство имен не отображается в массиве:

    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);

    return array(

        ...
        'App\\' => array($baseDir . '/app'),


        // I expected to see `'L5SimpleFM\\' => array($vendorDir . '/cschmitz/L5SimpleFM/src')` as the last key of this array, but nothing shows past the App key
    );

Я посмотрел в Интернете и на stackoverflow, но различные ответы и предложения, которые я нашел, не решили проблему.

Может ли кто-нибудь увидеть, что мне не хватает?

Обновлять

Согласно ответу Александру Гузински, я попытался сообщить моему проекту Laravel, что существует локальный репозиторий композитора для проверки, добавив следующий блок в файл composer.json моего проекта Laravel:

"repositories":[
    {
        "type": "vcs",
        "url": "../cschmitz/L5SimpleFM"
    }
],    

Затем я переместил папку пакета, начиная с каталога cschmitz, на тот же уровень моего проекта laravel. Структура файла теперь выглядит так:

LaravelProjectFolder/
    composer.json
cschmitz/
    L5SimpleFM/
        composer.json

Сначала я столкнулся с ошибкой «Не найден драйвер для работы с репозиторием VCS vendor/cschmitz». Почитав немного, я обнаружил, что для использования такого локального репозитория само репо должно находиться под контролем версий (например, git, svn и т. д.). Имеет смысл. Я еще не поставил его под контроль версий, потому что это был всего лишь тестовый проект, используемый для разработки пакета.

Я создал репозиторий git в корне моего проекта Laravel и запустил composer update. Теперь я получаю сообщение об ошибке:

[Composer\Repository\InvalidRepositoryException] Ни в одной ветке или теге ../cschmitz/L5SimpleFM не найден действительный файл composer.json, не удалось загрузить из него пакет.

Это сбивает с толку, потому что я могу ls ../cschmitz/L5SimpleFM/composer.json видеть файл. Я также могу запустить git ls-tree -r master --name-only и увидеть файл composer.json в локальном контроле версий репозитория:

composer.json в локальном репозитории git

Есть ли что-то, что помешает моему проекту Laravel увидеть файл composer.json локального репозитория?


person Chris Schmitz    schedule 18.08.2015    source источник
comment
Его еще нет в пакете, поэтому вам нужно указать Composer, где его найти в системе контроля версий, прежде чем composer install найдет и установит его getcomposer.org/doc/ Но я ожидаю, что композитор сообщит об ошибке, что он не может найти пакет, когда вы сделали composer install.   -  person Michael Berkowski    schedule 18.08.2015
comment
Было бы это необходимо, если бы я уже переместил пакет в папку поставщика вручную и сделал дамп-автозагрузку композитора? Я не думал, что композитору требуется упаковщик, если он просто автоматически загружает пространства имен.   -  person Chris Schmitz    schedule 18.08.2015
comment
Не уверен - я всегда добавлял ключ repositories, чтобы указать на исходный репозиторий. Я никогда не пробовал просто помещать их в vendor/   -  person Michael Berkowski    schedule 18.08.2015
comment
Вероятно, это связано с тем, что у вас уже есть файл блокировки, который считывается командой install. Добавьте расположение репозитория в файл composer.json, а затем запустите composer update Документация объясняет разницу   -  person Avalanche    schedule 18.08.2015
comment
Поэтому я удалил файл блокировки, запустил обновление композитора, и он все еще не добавляет мое пространство имен в файл автозагрузки. Я прочитал документацию, и файл блокировки по-прежнему звучит так, как будто он связан с загрузкой пакета, а не с созданием файла автозагрузки. Я снова прочитал раздел об автозагрузке, и все еще звучит так, как будто то, что я сделал, сработает. Я все еще что-то упускаю.   -  person Chris Schmitz    schedule 19.08.2015
comment
Есть ли дополнительная информация, которую было бы полезно показать?   -  person Chris Schmitz    schedule 19.08.2015


Ответы (1)


Недостаточно переместить вашу библиотеку в каталог vendor, потому что Composer не сканирует этот каталог и не знает о ваших изменениях.

Вам нужно сообщить Composer о своем пакете, опубликовав его в Packagist или загрузив его из локальной файловой системы. В файле composer.json вашего проекта Laravel измените:

"repositories": [
        {
            "type": "vcs",
            "url": "/path/to/cschmitz"
        }
],
"require": {
    "cschmitz/l5-simplefm": "dev-develop"
}

Далее вам нужно запустить composer update, чтобы ваша библиотека была установлена.


Не относится к вашей текущей проблеме, но скоро станет проблемой:

После того, как вы сделаете это и продолжите работу над своей библиотекой cschmitz/l5-simplefm, вы заметите, что вам нужно зафиксировать изменения, внесенные в вашу библиотеку, а затем снова запустить composer update в своем проекте Laravel, прежде чем вы сможете использовать эти изменения. У вас есть несколько решений здесь, как обойти эту проблему.

person Alexandru Guzinschi    schedule 19.08.2015
comment
Я считаю, что это приблизило меня, но я все еще сталкиваюсь с проблемой. Я обновлю первоначальный вопрос. - person Chris Schmitz; 19.08.2015
comment
@ChrisSchmitz Если вы передали свою библиотеку в ветку master, замените "cschmitz/l5-simplefm": "dev-develop" на "cschmitz/l5-simplefm": "dev-master" в своем проекте Laravel. - person Alexandru Guzinschi; 19.08.2015
comment
Пробовал, и я все еще получаю сообщение об ошибке No valid composer.json file found из моего обновления. Нужно ли мне также устанавливать что-то другое в файле библиотеки composer.json? - person Chris Schmitz; 19.08.2015
comment
Просмотрев все, я заметил, что по какой-то причине подпапка L5SimpleFM моего пакета не отслеживалась, хотя я видел файлы в списке git. Я удалил свою папку .git, снова инициализировал ее, добавил все (убедившись, что содержимое папки L5 отслеживается), зафиксировал, обновил композитор и посмотрел, как мой пакет загружается из моего локального репозитория. Спасибо за помощь! - person Chris Schmitz; 19.08.2015