我正在为 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
在问这个问题之前,我在谷歌上搜索了很多,并阅读了我能找到的几乎所有相关内容。显然,这是一个已知问题,已在 Laravel 存储库内的多个 GitHub 问题中进行了讨论。然而,即使在尝试了多种方法之后,我仍然没有找到解决方法。
问题似乎在于 Artisan 命令引导 Laravel,这会导致错误,因为服务提供者此时不可用 - 或类似的情况。将 clear-compiled
命令移至 post-update-cmd
会导致相同的错误,这让我有点惊讶,因为我认为此时服务提供商将可用。
唯一对我有用的是在运行 composer update
之前手动注释掉 config/app.php
中包含服务提供者的行,然后添加它之后再一次。我已经这样做了几个小时,这已经让我很烦恼,我真的不敢相信这个问题的存在。
有谁知道如何解决此错误,以便我在更新项目的 Composer 依赖项时不会收到找不到服务提供商的错误?
编辑:
这是该库的 composer.json
文件。
{
"name": "my-name/my-project",
"type": "library",
"authors": [
{
"name": "My Name",
"email": "test@example.com"
}
],
"require": {
"php": ">=5.5.0",
"laravel/framework": "~5.2"
},
"autoload": {
"classmap": [],
"psr-4": {
"MyName\\MyProject\\": "src/"
}
}
}
最佳答案
编辑
从 laravel/framework:v5.2.25
和 laravel/laravel:v5.2.27
开始,这个问题终于得到解决,并向后移植到 laravel/framework :v5.1.33
和 laravel/laravel:v5.1.33
。
除了 Laravel 框架 (laravel/framework
) 之外,此修复还包括对 Laravel 应用程序 (laravel/laravel
) 的更改。要实现,您需要:
1) 更新 composer.json
文件的 scripts
部分以匹配 laravel/laravel
package 中的内容。具体来说:
- 删除
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 更新
。如果您只想更新框架,可以运行 composer update laravel/framework
。
原版
查看 Github issue 后您在评论中发布的内容以及相关问题,您可能需要等待一段时间。 Taylor 希望将脚本放入 vendor/bin
中并更改 composer.json
来运行该脚本,但看起来他们正在等待社区的 PR,并赢得了胜利实际上他们自己并没有实现这个。
你没有做错任何事;您的自动加载设置正确。现在问题出在 Laravel 上。
将命令移至 post-update-cmd
脚本不起作用,因为 artisan 始终会尝试加载存在的缓存文件。运行 clear-compiled
命令时,artisan 在尝试删除缓存文件之前会加载它们(启动的一部分)。
最好的办法是在 artisan 运行之前手动删除缓存文件。而且,您需要在 Laravel/Artisan 之外进行。因此,您可以手动删除这些文件,或者您可以创建一个小脚本来执行此操作并将其添加到您的 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
存储/框架/services.json
关于php - 更新 Composer 依赖项时 Artisan 命令出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35026380/