Подтвердить что ты не робот

Ошибка при использовании команд Artisan при обновлении зависимостей Composer

Я разрабатываю библиотеку для Laravel, которая содержит поставщика услуг. Я добавил эту библиотеку в другой проект composer.json.

Файл composer.json для "основного проекта" содержит следующие сценарии.

"scripts": {
    "post-root-package-install": [
        "php -r \"copy('.env.example', '.env');\""
    ],
    "post-create-project-cmd": [
        "php artisan key:generate"
    ],
    "post-install-cmd": [
        "php artisan clear-compiled",
        "php artisan optimize"
    ],
    "pre-update-cmd": [
        "php artisan clear-compiled"
    ],
    "post-update-cmd": [
        "php artisan optimize"
    ]
},

Я могу включить библиотечную зависимость просто отлично, за исключением одной вещи; сценарии pre-update-cmd и post-update-cmd вызывают ошибку и вызывают у меня много головных болей. При запуске sudo composer update для обновления зависимостей я получаю следующую ошибку.

$ sudo composer update
> php artisan clear-compiled
PHP Fatal error:  Class 'MyName\MyProject\MyAwesomeServiceProvider' not found in /Users/Me/dev/MyProject/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 146


  [Symfony\Component\Debug\Exception\FatalErrorException]                                              
  Class 'MyName\MyProject\MyAwesomeServiceProvider' not found  


Script php artisan clear-compiled handling the pre-update-cmd event returned with an error


  [RuntimeException]                                                                                         
  Error Output: PHP Fatal error:  Class 'MyName\MyProject\MyAwesomeServiceProvider' 
  not found in /Users/Me/dev/MyProject/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 146

У меня довольно много проблем, прежде чем задавать этот вопрос и прочесть почти все, что я могу найти. По-видимому, это известная проблема, которая обсуждалась в нескольких проблемах GitHub в репозитории Laravel. Тем не менее, мне еще предстоит найти обходное решение, даже после нескольких попыток.

Похоже, что проблема заключается в том, что Artisan командует bootstrap Laravel, что приводит к ошибке, потому что поставщик услуг недоступен на данный момент - или что-то в этом роде. Перемещение команды clear-compiled на post-update-cmd вызывает ту же ошибку, которая меня немного удивляет, потому что я думал, что поставщик услуг будет доступен в этот момент.

Единственное, что работает для меня, - это вручную прокомментировать строку, которая включает поставщика услуг в config/app.php, перед запуском composer update, а затем снова добавить его. Я делаю это в течение нескольких часов, и это уже беспокоит меня, и я действительно не могу поверить, что эта проблема существует.

Кто-нибудь знает, как обойти эту ошибку, чтобы я не получил ошибку, которую мой поставщик услуг не обнаружил при обновлении зависимостей Composer для моего проекта?

EDIT: Вот файл composer.json для библиотеки.

{
    "name": "my-name/my-project",
    "type": "library",
    "authors": [
        {
            "name": "My Name",
            "email": "[email protected]"
        }
    ],
    "require": {
        "php": ">=5.5.0",
        "laravel/framework": "~5.2"
    },
    "autoload": {
        "classmap": [],
        "psr-4": {
            "MyName\\MyProject\\": "src/"
        }
    }
}
4b9b3361

Ответ 1

Изменить

Эта проблема, наконец, была разрешена как laravel/framework:v5.2.25 и laravel/laravel:v5.2.27, и передана обратно в laravel/framework:v5.1.33 и laravel/laravel:v5.1.33.

Это исправление включает изменение к приложению Laravel (laravel/laravel) в дополнение к Laravel Framework (laravel/framework). Для реализации вам необходимо:

1) Обновите раздел scripts вашего файла composer.json, чтобы он соответствовал этому в пакете laravel/laravel. В частности:

  • удалите раздел pre-update-cmd
  • в разделе post-install-cmd замените "php artisan clear-compiled" на "Illuminate\\Foundation\\ComposerScripts::postInstall"
  • в разделе post-update-cmd замените "php artisan clear-compiled" на "Illuminate\\Foundation\\ComposerScripts::postUpdate"

2) После того как вы обновили свой composer.json, запустите composer update. Если вы хотите обновить фреймворк, вы можете запустить composer update laravel/framework.


Оригинальные

После просмотра проблемы Github, опубликованной в комментариях, а также связанных с этим вопросов, вы можете быть немного Подождите. Тейлор хотел бы поместить script в vendor/bin и изменить composer.json для его запуска, но похоже, что они ждут PR от сообщества и фактически не реализуют это сами.

Вы не сделали ничего плохого; ваша автозагрузка настроена правильно. Проблема сейчас в Laravel.

Перемещение команды в post-update-cmd script не работает, потому что artisan всегда будет пытаться загружать файлы кеша, когда они существуют. При запуске команды clear-compiled, artisan загружает файлы кеша (часть запуска), прежде чем он когда-либо попытается их удалить.

Лучше всего вручную удалить файлы кеша до запуска мастера. И вам нужно сделать это за пределами Laravel/Artisan. Таким образом, вы можете вручную удалить файлы или создать небольшое script для этого и добавить это в свой composer.json файл (для вашего основного проекта, а не для вашего пакета).

Файлы для удаления:

  • Laravel 5.2:
    bootstrap/cache/compiled.php
    bootstrap/cache/services.php
  • Laravel 5.1:
    bootstrap/cache/compiled.php
    bootstrap/cache/services.json
  • Laravel 5.0:
    vendor/compiled.php
    storage/framework/compiled.php
    vendor/services.json
    storage/framework/services.json

Ответ 2

При использовании composer install или composer update вы можете использовать опцию --no-scripts, чтобы пропускать выполнение скриптов, определенных в composer.json.

е. g.: composer update --no-scripts.

Источник: https://getcomposer.org/doc/03-cli.md#install

Ответ 3

Похоже, вы просто не включаете свой ServiceProvider. Поместите это в свой корневой проект composer.json:

{
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "MyName\\MyProject\\": "../relative/path/to/serviceprovider/"
        }
    }
}

Ответ 4

composer update --no-scripts

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