2016-05-06 8 views
1

私は、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] 

&は、配列内の任意の追加の引数を包み込む:

答えて

2

&に削除します。既にmainにプログラムの引数を1回ラップしているので、set-optionsへの呼び出しでもう一度やり直す必要はありません。

+0

美しい。ありがとう! – nrako

関連する問題