忽略生产中的自定义Laravel Artisan命令

时间:2019-01-25 19:03:42

标签: php laravel artisan laravel-dusk

我编写了一个自定义的Artisan命令(简称为document.querySelector(".DbXTC button")),该命令扩展/抽象了Dusk核心命令的某些功能。

此自定义命令从Dusk软件包中扩展了MyDusk.php

问题是,在生产中未安装Dusk软件包(它位于Laravel\Dusk\Console\DuskCommand中的require-dev下)

因此,当作曲家在生产环境中生成其自动加载文件时,由于找不到composer.json,因此进入MyDusk.php时会出错。

Laravel\Dusk\Console\DuskCommand

我尝试将Dusk程序包移至PHP Fatal error: Class 'Laravel\Dusk\Console\DuskCommand' not found in app/Console/Commands/Dusk.php on line 10 In Dusk.php line 10: Class 'Laravel\Dusk\Console\DuskCommand' not found ,以便在生产环境中可用(我知道这并不理想),但是Dusk核心服务提供程序中有一条代码在生产环境中运行时会抛出异常,这个:

require

我正在尝试一种最优雅的解决方案,使我的自定义Dusk命令成为应用程序的一部分并可以在本地访问,而不会在生产中引发错误。

一个想法:将我的Dusk命令作为自己的包编写,这也仅在require-dev中。

还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

我刚刚看过API,您可以做到这一点:

您可以将命令移至App\Console\Commmands\Local\DuskCommand.php

默认情况下,如果您检查内核中的commands()方法,则只会加载App\Console\Commands中的命令。这将不包括子目录。

/**
 * Register the commands for the application.
 *
 * @return void
 */
protected function commands()
{
    $this->load(__DIR__.'/Commands');

    require base_path('routes/console.php');
}

这是默认的commands()方法。您可以将此实现切换为以下实现:

/**
 * Register the commands for the application.
 *
 * @return void
 */
protected function commands()
{
    $paths = [
        __DIR__ . '/Commands'
    ]; 

    if(app()->environment('local')) {
        $paths[] = __DIR__ . '/Commands/Local';
    }

    $this->load($paths);

    require base_path('routes/console.php');
}

因此,在本地,我们还将加载基于App\Console\Commands\Local的命令。

诚然,我自己没有尝试过,但是我认为它应该可以工作。

编辑:我尝试了一下,看来效果很好。我想,我想再解释一下。基本上,在完成composer dump-autoload之后,Laravel会监听此事件并做两件事:

"post-autoload-dump": [
    "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
    "@php artisan package:discover --ansi"
]

第二个尝试运行“自动打包发现”命令,这将导致失败。 Artisan可执行文件实际上是通过控制台内核启动应用程序的。

$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);

$status = $kernel->handle(
    $input = new Symfony\Component\Console\Input\ArgvInput,
    new Symfony\Component\Console\Output\ConsoleOutput
);

在解决内核时,它还将尝试启动所需的命令,以便Artisan可以使用它们,这就是失败的地方。

但是,就像我上面提到的那样,如果仅引导生产中需要的命令,则不会发生此问题。

答案 1 :(得分:0)

可接受的答案似乎在Laravel 6中不起作用。这对我有用:

  1. 使用php artisan make:command YourCommand创建命令并将其移至app / Console / Local。
  2. 将其命名空间更改为App \ Console \ Local。
  3. 然后,在app / Console / Kernel.php中:
protected function commands()
{
    $paths = [
        __DIR__ . '/Commands'
    ];

    if(app()->environment('local')) {
        $paths[] = __DIR__ . '/Local';
    }

    $this->load($paths);

    require base_path('routes/console.php');
}
  1. 享受;)