【问题标题】:Scalable applications with picocli. Best practice question使用 picocli 的可扩展应用程序。最佳实践问题
【发布时间】:2018-11-07 11:34:57
【问题描述】:

假设我的项目有很多逻辑,并且有几个入口点,它们是 CLI 命令。

我用@Command 注释我的入口点,初始化我的@Parameters@Option 注释字段并执行逻辑,这不再需要CLI。

在我看来,为每个 @Command 注释类声明 1 个 main 方法比较合适,但是,我不确定这是否是个好主意。

也许某种CommandFactory 是必要的?

我之前从未构建过 CLI 应用程序,也从未使用过 picocli,所以如果我的想法有误,请指出这一点。

【问题讨论】:

    标签: java command-line-interface picocli


    【解决方案1】:

    对于作为入口点的每个 @Command 有一个单独的 main 方法是非常好的。需要main 方法,以便可以从命令行独立调用该命令。

    例如:

    @Command(name = "hello")
    class Hello implements Runnable {
        public static void main(String[] args) {
            CommandLine.run(new Hello(), args);
        }
        public void run() { System.out.println("hello"); }
    }
    
    @Command(name = "bye")
    class Bye implements Runnable {
        public static void main(String[] args) {
            CommandLine.run(new Bye(), args);
        }
        public void run() { System.out.println("bye"); }
    }
    

    一个例外是当您的应用程序有带有subcommands 的命令时。在这种情况下,您只需要为顶级命令使用 main 方法,而不是为子命令。

    子命令示例:

    @Command(name = "git", subcommands = {Commit.class, Status.class})
    class Git implements Runnable {
        public static void main(String[] args) { // top-level command needs main
            CommandLine.run(new Git(), args);
        }
        public void run() { System.out.println("Specify a subcommand"); }
    }
    
    @Command(name = "commit")
    class Commit implements Runnable {
        @Option(names = "-m") String message;
        @Parameters File[] files;
    
        public void run() {
            System.out.printf("Committing %s with message '%s'%n",
                    Arrays.toString(files), message);
        }
    }
    
    @Command(name = "status")
    class Status implements Runnable {
        public void run() { System.out.println("All ok."); }
    }
    

    请注意,当有子命令时,只有顶级命令需要main 方法。 即使使用子命令,也不需要工厂。

    【讨论】:

    • 我想知道它的扩展性有多好。假设我想将它组装成一个.jar 文件。如果我希望它有两个入口点,myprogram mycommand -o=optionmyprogram anothercommand -o=option,我会怎么做,以便它知道启动单独的主要方法?我是否可以使用清单来实现这一目标?
    • 在您的示例中,myprogram 是顶级命令,mycommandanothercommand 是子命令,不是吗?
    • 我必须研究子命令。如果 git 是用 picocli 制作的,pullcommit 等会是子命令吗?如果是这样,那么这就是我正在寻找的。​​span>
    • 阅读示例,我发现子命令概念正是我所需要的。感谢您对我的包容!
    • 很高兴听到这个消息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多