Clojureでコマンドライン引数パースめも
tools.cliを用いれば簡単にできる。
導入
- project.clj の :dependencies に以下を追記
[org.clojure/tools.cli "0.2.2"]
利用例
- use に以下を追加
[clojure.tools.cli :only (cli)]
- main関数の実装例
(defn -main [& args] (let [[options extra-args banner] (cli args ["-p" "--port" "Listen on this port" :default 9999 :parse-fn #(Integer. %)] ["-h" "--host" "The hostname" :default "localhost"] ["-v" "--[no-]verbose" "Verbose" :default true] ["-h" "--help" "Show Help" :flag true])] (if (:help options) (println banner) ; ヘルプオプションが指定された場合はbannerを表示して終了 (my-function (:port options) ; そうでない場合は、各オプションとオプション以外の引数を渡して主処理実行 (:host options) (:verbose options) extra-args))))
- 実行例
lein run -- --help ;=> ;Usage: ; ; Switches Default Desc ; -------- ------- ---- ; -p, --port 9999 Listen on this port ; -h, --host localhost The hostname ; -v, --no-verbose, --verbose true Verbose ; -h, --no-help, --help false Show Help lein uberjar java -jar target/該当のjar --help ;=> (同上) lein repl (use :reload 'myapp.core) (-main "--help") ;=> (同上)
補足
- cli 関数の戻り値は options extra-args banner からなるベクタ
- options コマンドオプション部分をパースしてマップにしたもの
- extra-args コマンドオプション以外の引数のベクタ
- banner ヘルプ表示用の整形された文字列