【发布时间】:2019-11-20 13:36:05
【问题描述】:
我正在为 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
在问这个问题之前,我已经用 Google 搜索了很多遍,并阅读了几乎所有我能找到的相关内容。显然,这是一个已知问题,已在 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/"
}
}
}
【问题讨论】:
-
您可以显示您图书馆的
composer.json文件吗? -
@patricus 当然,我已经用这个编辑了这个问题。
-
谢谢。而且,为了确保您可以在
vendor/my-name/my-project/src/MyAwesomeServiceProvider.php看到您的服务提供商,其中的第一行是<?php namespace MyName\MyProject;,对吗?所有的外壳也都匹配了吗? -
@patricus 是的,我可以确认两者,并且自动加载也设置正确。这是一个已知问题,但我还没有找到任何适合我的解决方案。 github.com/laravel/framework/issues/9678
-
我发现的一件事是,当你在一个包上开发并且服务提供者在
app.providers中注册但作曲家不知道它时,就会发生这种情况。在这种情况下,composer dump-autoload -o通过重新生成其路径解决了这个问题。然后composer [install|update]将相应地工作。