您可以利用工具-cli允许您为每个命令行选项指定的:id
,:default
和:assoc-fn
属性来实现此目的。
- 使用
:id
设置相同的ID为“--enable”和“ - 禁用”选项
- 上的一个选项使用
:default
指定要如果没有“--enable”发生什么或“--disable”被指定
- 使用
:assoc-fn
指定该选项对选项图有什么影响。每次出现“--disable”时,您都希望将值设置为false
,并且每次出现--enable
时都要true
。
全部放在一起:
(ns clis.core
(:require [clojure.tools.cli :refer [parse-opts]])
(:gen-class))
(def cli-options
[["-e" "--enable" "Enable"
:default true
:id :boolean-flag
:assoc-fn (fn [m k _] (assoc m k true))]
["-d" "--disable" "Disable"
:id :boolean-flag
:assoc-fn (fn [m k _] (assoc m k false))]])
(defn -main [& args]
(parse-opts args cli-options))
测试在REPL:
(-main)
;; {:options {:boolean-flag true}, :arguments [], :summary " -e, --enable Enable\n -d, --disable Disable", :errors nil}
(-main "-e" "-d" "-e")
;; {:options {:boolean-flag true}, :arguments [], :summary " -e, --enable Enable\n -d, --disable Disable", :errors nil}
(-main "-e" "-d" "-e" "-d")
;; {:options {:boolean-flag false}, :arguments [], :summary " -e, --enable Enable\n -d, --disable Disable", :errors nil}
使用相同ID抛出一个错误,不是吗?我认为每个参数的ID必须是唯一的。 – djhaskin987
情况并非如此。我包含的代码作品。另请参阅[docstring for parse-opts](https://github.com/clojure/tools.cli/blob/master/src/main/clojure/clojure/tools/cli.clj#L498)。它特别指出,多个选项条目可以共享相同的':id' – ez121sl