You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PicoCLI中挂钩逻辑:参数解析后命令执行前统一执行操作

在PicoCLI中实现统一前置逻辑注入(参数解析后、命令执行前)

要在所有@Command执行前、参数解析完成且依赖参数的IExecutionStrategy处理后插入统一逻辑(比如日志问候),可以通过以下两种方式实现,适配Enola CLI的结构:

方法一:自定义IExecutionStrategy装饰器

这种方式通过包裹默认执行策略,全局拦截所有命令的执行流程,无需修改现有命令类:

  1. 实现装饰器类,包裹原有IExecutionStrategy,在执行命令前插入统一逻辑:
public class PreExecutionDecorator implements IExecutionStrategy {
    private final IExecutionStrategy delegate;

    public PreExecutionDecorator(IExecutionStrategy delegate) {
        this.delegate = delegate;
    }

    @Override
    public int execute(CommandLine.ParseResult parseResult) throws ExecutionException, InterruptedException {
        // 从解析结果中获取参数,执行统一逻辑(比如日志问候)
        String userName = parseResult.matchedOptionValue("user", "Guest");
        System.out.printf("Hello, %s! Welcome to Enola CLI.%n", userName);

        // 执行原命令逻辑
        return delegate.execute(parseResult);
    }
}
  1. 在Enola CLI的入口类中,替换默认执行策略:
    找到Enola CLI的主入口(比如dev/enola/cli/EnolaCli.java),在构建CommandLine实例时设置装饰后的策略:
public class EnolaCli {
    public static void main(String[] args) {
        CommandLine cmd = new CommandLine(new MainCommand())
                .setExecutionStrategy(new PreExecutionDecorator(new DefaultExecutionStrategy()));
        int exitCode = cmd.execute(args);
        System.exit(exitCode);
    }
}

方法二:使用@BeforeExecution钩子

如果希望通过命令层级继承实现统一逻辑,可以在顶层父命令中定义@BeforeExecution方法,所有子命令自动继承该逻辑:

  1. 在顶层主命令类中添加前置执行方法:
@Command(name = "enola", subcommands = {YourSubCommand1.class, YourSubCommand2.class})
public class MainCommand {
    @Option(names = {"-u", "--user"}, description = "Your name")
    private String user;

    @BeforeExecution
    public void runPreExecutionLogic(CommandLine.ParseResult parseResult) {
        String userName = user != null ? user : parseResult.matchedOptionValue("user", "Guest");
        System.out.printf("Hello, %s! Welcome to Enola CLI.%n", userName);
    }
}
  1. 所有子命令继承该主命令即可自动触发前置逻辑,若子命令需要自定义前置逻辑,可添加自己的@BeforeExecution方法,两者会按顺序执行。

适配Enola CLI的注意点

在Enola的java/dev/enola/cli目录中,找到顶层命令类(通常是包含main方法或作为根命令的类):

  • 若用装饰器方式,在构建CommandLine实例的代码处替换执行策略;
  • 若用@BeforeExecution,直接在顶层命令类中添加对应方法即可。

内容的提问来源于stack exchange,提问作者vorburger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:18:20