[英]Parse Clojure Command Line Args
我試圖將cli選項分離到一個獨立的命名空間中,以啟動HTTP服務器,但出現此錯誤-
clojure.lang.ArraySeq cannot be cast to java.lang.CharSequence
在main.clj
,此代碼可以正常工作-
(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
,它將正確編譯。
當我使用外部命名空間served.server.cli-options
而不是clojure.tools.cli
直接調用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))
據我所知,我已將內容正確復制到新的名稱空間。 下面是該文檔parse-opts
, 這里是我從圖紙的例子,和類似的,但不同的SO發出這里 。
我的問題-如何將CLI args轉換為引發轉換錯誤,以及如何解決?
任何幫助將不勝感激。
刪除&
中:
(defn set-options [& args]
&
將所有其他參數包裝在seq中。 由於您已經在main
包裝了一次程序參數,因此您不必在調用set-options
再做一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.