我正在尝试将我的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
。
删除(def cli-options)
中的main
以避免任何全局冲突后,此处为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 args转换为抛出转换错误,我该如何修复它?
非常感谢任何帮助。
答案 0 :(得分:2)
删除{}中的&
:
(defn set-options [& args]
&
包含seq中的任何其他参数。由于您已经在main
中包含了一次程序参数,因此在调用set-options
时不得再次执行此操作。