我用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
。