带有多个子命令的Clojure CLI



我用clojure写了一些库来抓取一些搜索结果,作为一个小的业余项目。我想在cli中使用这些库,其中会有一些不同的脚本可以运行,例如:

  • 收集、运行刮刀作业,
  • 浏览,浏览先前收集的结果,
  • search-config,添加或删除搜索参数

我想实现的解决方案作为命令行接口如下:

cljscrape [general flags] subcommand [flags] [args]

我知道你可以使用这篇文章中提到的包,但它似乎只解析标志。如果有人能推荐如何构建项目,或一个包,将允许我最好地模仿模板格式,那将是了不起的!

p。S

我对clojure很陌生,所以如果我说了什么愚蠢的话,我道歉。谢谢!:)

一个使用babashka CLI的例子:

(def args ["--general-flag" "subcommand" "--flag" "arg"])
(require '[babashka.cli :as cli])

varargs包含一些示例参数。通常你会从*command-line-args*或传递给-main函数的参数中得到这些。

首先解析常规选项:

(def parsed (cli/parse-args args {:coerce {:general-flag :boolean}}))
;;=> {:opts {:general-flag true}, :args ["subcommand" "--flag" "arg"]}

注意,在:opts中,我们现在有解析的通用选项,其余的参数,仍然未解析,保存在:args中。

当我们用parse-args依次解析这些:args时,我们得到了子命令,选项和参数:

(cli/parse-args (:args parsed) {:coerce {:flag :boolean}})
;;=> {:cmds ["subcommand"], :opts {:flag true}, :args ["arg"]}

因此,您可以使用这两步过程来支持一般参数。要对子命令进行分派,您可以阅读这里的文档。您可以在neil项目中看到调度函数的运行情况。对于本例,它类似于:

(def dispatch-table
[{:cmds ["subcommand"] :fn handle-subcommand}])
(cli/dispatch dispatch-table (:args parsed) {:coerce {:flag :boolean}})
然后用参数{:opts {:flag true}, :args ["arg"]}

调用和函数handle-subcommand

最新更新