私は、HTTPサーバを起動するためのスタンドアロンの名前空間の中に、私のCLIオプションを分離しようとしている、と私はこれがmain.clj
で解析ClojureのコマンドラインのArgs
clojure.lang.ArraySeq cannot be cast to java.lang.CharSequence
をエラー - 取得しています、このコードは正常に動作します -
(ns served.main
(:require [org.httpkit.server :refer [run-server]]
[served.app.core :refer [handler]]
[served.server.cli-options :refer [set-options]]
[clojure.tools.cli :refer [parse-opts]])
(:gen-class))
(def cli-options
[
["-p" "--port PORT" "Port number"
:default 5000
:parse-fn #(Integer/parseInt %)
:validate [#(< 0 % 0x10000) "Must be a number between 0 and 65536"]]
])
(defn -main [& args]
(println "Server starting")
(let [options (get (parse-opts args cli-options) :options)]
;;(let [options (set-options args)]
(println (str options))
(run-server handler options)))
それは(def cli-options)
におけるデフォルトのオプションで動作しますし、私はそのような-p 7000
として、引数に渡した場合、それは正しくコンパイル。
clojure.tools.cli
の代わりに外部名前空間served.server.cli-options
をmain関数(つまり、main
に切り替える)を呼び出すと、argsを渡すときにのみエラーが発生します。
つまり、引数なしでサーバーを起動します。 lein run
は正常にコンパイルされ、デフォルト値が出力されます。エラーはlein run -p 7000
で発生します。
任意のグローバル競合を避けるためにmain
で(def cli-options)
を削除した後、ここではこれまでのところ、私が言うことができるようにserved.server.cli-options
(ns served.server.cli-options
(:require [clojure.tools.cli :refer [parse-opts]]))
(def cli-options
[
["-p" "--port PORT" "Port number"
:default 5000
:parse-fn #(Integer/parseInt %)
:validate [#(< 0 % 0x10000) "Must be a number between 0 and 65536"]]
])
(defn set-options [& args]
(let [options (get (parse-opts args cli-options) :options)]
(println (str options))
options))
ですが、私は正確に新しいネームスペースに内容をコピーしました。 Hereは、parse-opts
のドキュメントであり、hereは、私が描いている例であり、同様のしかし異なるSOの問題hereです。
私の質問 - どのようにCLIの引数が鋳造エラーをスローするように変換されているのですか?
ご協力いただければ幸いです。
(defn set-options [& args]
&
は、配列内の任意の追加の引数を包み込む:
美しい。ありがとう! – nrako