在 laravel 5.2 内核控制台中通过新的 artisan 命令删除旧的 artisan 命令

Remove old artisan command by new artisan command in laravel 5.2 kernel console

我在内核命令中工作,我需要更改旧命令:

旧命令是:

php artisan crawl:author

现在我需要将其重命名为:

php artisan crawl-bq:author

在我的命令文件签名中更改为:

受保护的 $signature = 'crawl-bq:author';

我使用以下命令清理了 artisan 缓存:

php artisan cache:clear
php artisan config:cache

我的旧命令仍然有效,新命令也有效。但是当我看到 artisan 列表 "php artisan list" 时,那里也看不到旧命令。

有人可以帮助我吗?

我复制了您提到的所有步骤,并且更改签名没有问题 - Laravel 似乎没有将 artisan 命令包含到配置缓存中,或与此相关的任何其他地方。如果文件名保持不变,则 Composer dump-autoload 与此处无关。

我能给出的唯一建议是检查 Console/Kernel.php $commands 以确保没有重复的命令被加载并且所有签名都是它们应该的。也许其他命令仍在执行旧签名?

我意识到这是一个老问题。也许您已经设法解决了这个问题?

您需要从 app/Console/Commands/

中删除旧的命令文件

这应该有效。

旧命令是:

php artisan crawl:author

现在我们重命名为 "crawl-bq:author"

php artisan crawl-bq:author (Will Work)
php artisan crawl-b:author (Will Work)
php artisan craw:author (Will Work)
php artisan crawl:author (Will Work)

解决方案

用其他名称重命名,例如 "newcrawl-bq:author"

php artisan crawl:author (Not work)
php artisan crawl-bq:author (Not work)
php artisan newcrawl-bq:author (Will work)

很长一段时间后,我发现 Laravel 5.2 artisan console 命令有一个错误或者不是错误,因为至少有一个命令将根据初始模式匹配执行。

假设您在两个不同的命令文件中有两个签名,例如以下 4 种情况:

案例一:

protected $signature = 'crawl:author-usa';
protected $signature = 'crawl:author-uk';

或案例二:

protected $signature = 'crawl:authorusa';
protected $signature = 'crawl:authoruk';

或案例三:

protected $signature = 'crawl-bq:author-usa';
protected $signature = 'crawl-bq:author-uk';

或案例四:

protected $signature = 'crawl-bq:authorusa';
protected $signature = 'crawl-bq:authoruk';

对于任何一种情况,如果您 运行 php artisan crawl:auther 命令,那么对于情况 I,它将显示模棱两可的错误,例如:

[Symfony\Component\Console\Exception\CommandNotFoundException] Command "crawl:author" is ambiguous (crawl:author-usa, crawl:author-uk).

其余 3 个案例将显示相同的模糊消息,但签名文本会有所不同。

现在假设 4 种不同情况下的签名如下:

案例一:

protected $signature = 'crawl:author-usa';

或案例二:

protected $signature = 'crawl:authorusa';

或案例三:

protected $signature = 'crawl-bq:author-usa';

或案例四:

protected $signature = 'crawl-bq:authorusa';

对于任何一种情况,如果您 运行 php artisan crawl:auther 命令,它将执行该命令。

对于这两种情况,它的发生是因为 Symfony/Cconsole find() 函数。此处通过此表达式搜索确切的命令:crawl[^:]*[^:]*:author[^:]*[^:]*。这意味着,如果任何签名具有 crawl<anything>:author<anything> 将与 php artisan crawl:author

匹配

现在,如果我要解决这个问题,首先需要更改 symfony/consle 文件中靠近 509 行的 public function find($name)。或者是否有可能覆盖此功能(我不确定如何完成此覆盖)。

我受到 @Nadeem0035 的启发,他在 symfony/consle 文件的 509 行附近提到了 public function find($name)。如果我能在赏金持续时间内奖励赏金,我会很高兴,因为至少他向我展示了一种找到控制台命令的确切场景的方法。这就是为什么投赞成票老兄:)