如何使用 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
我正在使用的 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