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

And*_*708 13 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"
    ]
},
Run Code Online (Sandbox Code Playgroud)

除了一件事,我可以很好地包含库依赖项; 在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
Run Code Online (Sandbox Code Playgroud)

在问这个问题之前,我已经开始搜索了很多内容,并仔细阅读了我能找到的所有相关内容.显然,这是一个已知问题,已在Laravel存储库中的多个GitHub问题中进行了讨论.但是,即使在尝试了多个问题之后,我还没有找到解决方法.

似乎问题是Artisan命令引导Laravel,这会导致错误,因为此时服务提供程序不可用 - 或类似的东西.移动clear-compiled命令post-update-cmd导致相同的错误,这让我感到惊讶,因为我认为服务提供商此时可用.

对我有用的唯一事情是config/app.php在运行之前手动注释掉包含服务提供者的行composer update,然后再添加它.我已经这样做了几个小时,它已经困扰了我,我真的不敢相信这个问题.

有没有人知道如何解决此错误,以便在更新我的项目的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/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

pat*_*cus 5

编辑

这个问题终于得到了解决为laravel/framework:v5.2.25laravel/laravel:v5.2.27,和回迁到laravel/framework:v5.1.33laravel/laravel:v5.1.33

此修复程序包括对Laravel应用程序的更改(laravel/laravel除了Laravel框架(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问题以及相关问题之后,您可能需要等待一段时间。泰勒想放下剧本vendor/bin并进行修改composer.json以运行该,但是看起来他们正在等待社区的PR,并且实际上不会自己实现。

您没有做错任何事;您的自动加载设置正确。现在的问题是Laravel。

将命令移至post-update-cmd脚本不起作用,因为技术人员将始终尝试在缓存文件存在时加载它们。运行时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
    storage/framework/services.json