【问题标题】:Passing command line arguments in lein repl在 lein repl 中传递命令行参数
【发布时间】:2017-07-31 12:47:20
【问题描述】:

我有一个接受命令行参数的主函数声明

(defn -main [& args]
    (let [options (cli/parse-opts args [["-k", "--key KEY","Secret key"]
                                        ["-u", "--user USER", "User name"]])]
        (println user key)))

我正在尝试将其加载到 lein repl 以进行调试,但无法弄清楚如何通过 REPL 传递参数。

我尝试了多种方法将参数传递给 repl,包括

(-main "key-val" "user-val")(打印nil nil

(-main ("key-val" "user-val"))(打印nil nil

我尝试了多次失败的尝试,并尝试传递一个引发转换错误的列表或向量。

【问题讨论】:

  • 转换错误是否(或可能)指向您应该传入的类型?您也可以尝试打印args,而无需对其进行解析。也许“key-val”“user-val”被很好地传递了。
  • @ChrisMurphy 这就是问题所在。我应该打印 args 并检查。根据接受的答案,参数被很好地传递了,但没有被解析。

标签: clojure leiningen


【解决方案1】:

您已经使用键“-k”和“-u”定义了参数,但没有将键传递给函数,因此解析器将无法猜测您期望它得到什么。工作版本是这样的:

user> (defn -main [& args]
        (let [options (cli/parse-opts args [["-k", "--key KEY","Secret key"]
                                            ["-u", "--user USER", "User name"]])
              {:keys [key user]} (:options options)]
          [key user]))
#'user/-main

user> (-main "-k" "key-val" "-u" "user-val")
;;=> ["key-val" "user-val"]

user> (-main "--key" "key-val" "--user" "user-val")
;;=> ["key-val" "user-val"]

【讨论】:

  • 完美运行。这种疏忽现在似乎太明显了。
【解决方案2】:

首先,请注意userkey 未绑定到parse-opts 的结果。 parse-opts returns a map 其中这些选项位于密钥 :options 下。 让我们将结果绑定如下:

(defn -main [& args]
  (let [options (parse-opts args [["-k", "--key KEY","Secret key"]
                                  ["-u", "--user USER", "User name"]])
        user (get-in options [:options :user])
        key  (get-in options [:options :key])]
    (println user key)))

您的 parse-opts 调用指定您希望 命名参数,即 options 进行解析。来自 REPL 的类似如下调用:

(-main "-k a" "-u b") ; prints "b a"

请注意,如果您指定位置参数,它们位于键 :arguments 下。更改示例以打印绑定到选项 ((println options)) 的值后,您的示例调用将如下所示:

(-main "key-val" "user-val") ; {:arguments [key-val user-val] :options {} ...}

所以调用是在没有选项的情况下进行的,也就是说,没有指定命名参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2012-07-11
    • 2020-08-24
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多