php - 更新 Composer 依赖项时 Artisan 命令出错

标签 php laravel laravel-5

我正在为 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-cmdpost-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.25laravel/laravel:v5.2.27 开始,这个问题终于得到解决,并向后移植到 laravel/framework :v5.1.33laravel/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/

相关文章:

PHP & MySQL - 处理不同数据库语言内容的最佳方式

PHP上传到数据库

php - Doctrine2 和 UTF-8

php - 在 Laravel 中,如何从 Users 表中检索随机 user_id 以生成模型工厂种子数据?

javascript - Laravel 5.2 从 URL 捕获 anchor 名称

php - 验证电子邮件已打开

laravel cron 没有触发,但其他 cron 正在触发

php - Laravel 中首先按关系排序

php - Laravel 5 不适用于共享主机

php - 如何正确捕获 PHP 异常 (Laravel 5.1)