我编写了一个自定义的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中。
还有其他想法吗?
答案 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中不起作用。这对我有用:
php artisan make:command YourCommand
创建命令并将其移至app / Console / Local。protected function commands()
{
$paths = [
__DIR__ . '/Commands'
];
if(app()->environment('local')) {
$paths[] = __DIR__ . '/Local';
}
$this->load($paths);
require base_path('routes/console.php');
}