Ошибка при использовании команд 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/"
}
}
}
Ответы
Ответ 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, которая будет проверять, загружен ли сервис-провайдер.