使用Clojure tools.cli如何校验仅传入可接受的命令行选项
Clojure tools.cli 校验未知选项的原生实现方式
tools.cli 从0.4.0版本开始就内置了严格选项校验能力,不需要编写自定义遍历校验逻辑,直接通过配置即可实现未定义选项拦截:
核心配置
调用parse-opts解析命令行参数时,传入:strict true配置项即可开启严格模式。开启后所有未在预定义选项列表中声明的横杠开头参数(比如你提到的-d),都会被自动识别为非法参数,对应的错误信息会被收集到返回结果的:errors字段中。完整实现示例
;; 引入依赖 (require '[clojure.tools.cli :refer [parse-opts]]) ;; 预先定义所有合法选项 (def allowed-cli-options [["-a" "开启功能A"] ["-b" "开启功能B"] ["-c" "配置C项取值" :default "val-c"] ["-h" "--help" "输出帮助说明"]]) (defn -main [& input-args] (let [parse-result (parse-opts input-args allowed-cli-options :strict true) {:keys [options arguments errors summary]} parse-result] ;; 拦截所有解析错误,包含未知选项错误 (when errors (binding [*out* *err*] (println "命令行参数不合法:") (run! println errors) (println "\n可用选项列表:") (println summary)) (System/exit 1)) ;; 错误拦截通过后,执行正常业务逻辑 (println "参数解析完成,合法配置:" options) (println "传入的位置参数:" arguments)))
- 效果说明
如果用户传入未定义的-d参数,程序会自动输出如下错误信息后退出:
命令行参数不合法: Unknown option: "-d" 可用选项列表: -a 开启功能A -b 开启功能B -c 配置C项取值 -h, --help 输出帮助说明
- 注意事项
- 严格模式不会将不带选项前缀的位置参数判定为非法,这类参数会正常存入返回结果的
:arguments字段,不会触发错误。 - 如果你使用的是0.4.0之前的旧版本tools.cli,没有内置
:strict配置,需要先升级版本才能使用该原生能力。
- 严格模式不会将不带选项前缀的位置参数判定为非法,这类参数会正常存入返回结果的
内容的提问来源于stack exchange,提问作者Joshua Fox
相关产品推荐
相关产品推荐

