Как реализовать подкоманду с помощью модуля App :: Cmd? - PullRequest
0 голосов
/ 21 декабря 2018

Я использую App :: Cmd для создания своих приложений CLI.

Возможно ли реализовать подкоманду, такую ​​как docker network inspect?(при условии, что inspect является подкомандой)

У меня есть следующий код для реализации команды foo bar

$ cat bin/foo
#!/usr/bin/perl
use Foo;
Foo->run;

$ cat lib/Foo.pm 
package Foo;
use App::Cmd::Setup -app;
1;

$ cat lib/Foo/Command/bar.pm 
package Foo::Command::bar;
use App::Cmd::Setup -command;

sub execute {
    print "Hello world\n";
}

1;

Я реализовал подкоманду foo bar baz, изменив lib/Foo/Command/bar.pm как:

sub execute {
    my ( $self, $opt, $args ) = @_;    
    my $subcommand = $args->[0];

    if ( $subcommand eq 'baz' ) {
        print "Subcommand baz is working\n";
    }

    ...
}

Есть ли лучший способ?

Большой минус подхода $args->[0] в том, что вы не можете автоматически сгенерировать --help (foo bar покажет ту же помощь, что и foo bar baz)

Другими словами, App::Cmd отточено для <bin_name> <command> [-?h] [long options...] синтаксиса вызова, но мне нужен <bin_name> <command> <subcommand> [-?h] [long options...] синтаксис.

PS Я создал Github-репозиторий для экспериментов

...