簡體   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