首页 > 解决方案 > 如何使用 getopt 子类化 Minion 命令?

问题描述

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

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

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

但是,当我尝试传递原始工作命令中的选项时 - 例如-j我得到:

Unknown option: j

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

标签: perlmojolicious

解决方案


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

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

推荐阅读