解析Clojure命令行Args

时间:2016-05-06 20:13:20

标签: clojure

我正在尝试将我的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))

据我所知,我正确地将内容复制到新的命名空间。 Hereparse-opts的文档,here是我正在绘制的示例,以及类似但不同的SO问题here

我的问题 - 如何将CLI args转换为抛出转换错误,我该如何修复它?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

删除{}中的&

(defn set-options [& args]

&包含seq中的任何其他参数。由于您已经在main中包含了一次程序参数,因此在调用set-options时不得再次执行此操作。