如何使用 getopt 子类化 Minion 命令?

How can I subclass a Minion command with getopt?

我正在使用的 Minion 作业队列中的一项任务需要用户名和密码。

我找到了关于如何将参数传递给 Mojo 应用程序的很好的描述 here 所以我这样做了:

package Minion::Command::minion::secure_worker;

use Mojo::Base 'Minion::Command::minion::worker';
use Mojo::Util 'getopt';

sub run {
    my ( $self, @args ) = @_;

    my $worker = $self->app->minion->worker;
    my $status = $worker->status;

    getopt \@args,
    'U|username=s' => \my $username,
    'P|password=s' => \my $password;

    $self->app->credentials->{username} = $username;
    $self->app->credentials->{password} = $password;

    return $self->SUPER::run;
}

1

然而,当我尝试传递原始 worker 命令中的选项时 - 例如 -j 我得到:

Unknown option: j

这是为什么?看起来子类化命令不起作用,或者 getopt 吞噬一切?

getopt 的调用不可组合。您可以尝试处理(然后传递)您的超类也处理的所有选项,或者使用 pass_through 选项自己调用 Getopt::Long。这将忽略所有未知选项:

package Minion::Command::minion::secure_worker;

use Mojo::Base 'Minion::Command::minion::worker';
use Getopt::Long 'GetOptionsFromArray';
use Getopt::Long ':config', 'pass_through';

sub run {
    my ( $self, @args ) = @_;

    my $worker = $self->app->minion->worker;
    my $status = $worker->status;

    GetOptionsFromArray \@args,
    'U|username=s' => \my $username,
    'P|password=s' => \my $password;

    $self->app->credentials->{username} = $username;
    $self->app->credentials->{password} = $password;

    return $self->SUPER::run;
}

1