繁体   English   中英

解析Clojure命令行参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM