我目前正在OCaml中创建一个CLI应用程序,并使用Core.Command
({3}}中包含的CLI解析器来解析命令行。
我希望有一个可用于任何子命令的全局标志(例如git中的--paginate
或--git-dir
标志)。
例如,我想要一个-debug
标志,以便以下两个命令有效
my-cli -debug hello world
my-cli -debug goodbye world
但是,我找不到使用Core.Command
API执行此操作的方法。
这是我目前拥有的简化版本。
open Core
let initialize_logger debug =
Logs.set_reporter (Logs_fmt.reporter ());
let log_level = if debug then Logs.Debug else Logs.Info in
Logs.set_level (Some log_level)
let some_func_with_logging () =
Logs.debug (fun m -> m "the flag debug was passed!")
let hello name =
some_func_with_logging ();
Printf.printf "Hello %s!\n" name
let goodbye name =
some_func_with_logging ();
Printf.printf "Goodbye %s!\n" name
let hello_command =
let open Command.Let_syntax in
Command.basic
~summary:"says hello"
[%map_open
let name = anon ("name" %: string)
and debug = flag "debug" no_arg ~doc:"debug" in
fun () ->
initialize_logger debug;
hello name
]
let goodbye_command =
let open Command.Let_syntax in
Command.basic
~summary:"says goodbye"
[%map_open
let name = anon ("name" %: string)
and debug = flag "debug" no_arg ~doc:"debug" in
fun () ->
initialize_logger debug;
goodbye name
]
let main_command =
Command.group ~summary:"a cool CLI tool"
[ ("hello", hello_command);
("goodbye", goodbye_command);
]
let () = Command.run main_command
这里有两个主要问题:
debug
标志以及对initialize_logger
的调用在每个子命令中都是重复的debug
而不是my-cli hello world -debug
使用my-cli -debug hello world
API处理此问题是否有一种干净的方式?