使用命令行界面构建Clojure应用程序?

80

9
请注意,如果您的应用程序经常运行,每次都将支付JVM启动成本。 - Stuart Sierra
1
@StuartSierra 不使用drip - Ben
5个回答

121

下面是使用其with-command-line宏的示例。以下代码指定了一个微不足道的类,其中包含一个什么也不做,只打印其命令行参数值的主方法。

(ns cmd-line-demo
  (:gen-class)
  (:use clojure.contrib.command-line))

(defn -main [& args]
  (with-command-line args
      "Command line demo"
      [[foo "This is the description for foo" 1]
       [bar "This is the description for bar" 2]
       [boolean? b? "This is a boolean flag."]
       remaining]
    (println "foo: " foo)
    (println "bar: " bar)
    (println "boolean?: " boolean?)
    (println "remaining: " remaining)))

在REPL中编译该类:

user> (compile 'cmd-line-demo)
cmd-line-demo

使用示例

1)不带命令行参数执行会显示帮助信息。也可以使用--help-h标志来显示帮助信息。请注意,帮助信息是根据您的命令规范自动生成的。

$ java -classpath . cmd_line_demo
Command line demo
Options
  --foo <arg>    This is the description for foo  [default 1]
  --bar <arg>    This is the description for bar  [default 2]
  --boolean, -b  This is a boolean flag.  

2) 未指定的参数将接收命令规范绑定中指定的默认值。例如,bar 的默认值为 2

$ java -classpath . cmd_line_demo --foo "changed value"
foo:  changed value
bar:  2
boolean?:  nil
remaining:  []

3) 在cmdspec中,布尔标志由后缀"?"表示。请注意,标志本身的名称包括"?"。

$ java -classpath . cmd_line_demo -boolean
foo:  1
bar:  2
boolean?:  true
remaining:  []

4) 还要注意,您可以通过在cmdspec中指定多个符号来指定标志别名。我已经在 boolean?b? 标志中实现了这一点。

5) 最后,我已经指定remaining捕获所有没有关联标志的剩余参数。

$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo:  test
bar:  2
boolean?:  nil
remaining:  [file1 file2 file3]

太棒了,这正是我在寻找的。非常详尽。希望它在谷歌上排名靠前 :) - kush
1
这确实是存在的最令人惊叹的例子。 - Alex Miller
9
对于Clojure 1.3,人们应该开始使用tools.cli(新的contrib)。请参见http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go和https://github.com/clojure/tools.cli。 - semperos

34

12

我想补充一点,你可以这样做

(apply -main *command-line-args*)

(defn -main ...)下面添加内容以使其在解释模式下工作。


8

在提出问题很久之后,我可以建议在构建CLI界面时使用docopt库。对于Clojure,有一个叫做docopt.clj的库。

docopt基于用于程序接口描述中帮助消息和手册页中几十年来使用的约定。在docopt中,接口描述就是这样一条帮助消息,但是已经形式化了。

因此,您可以同时“声明”您的接口并记录它 - 这非常惊人且易于操作。

有关更多详细信息,请查看http://docopt.org/

另外还有一个在线应用程序可用于检查您的接口http://try.docopt.org/

最后,这是我的一个示例,演示了如何使用Clojure库。


1

或许可以尝试使用Jark。 Jark是一个在持久化JVM上运行Clojure程序的工具。它还有一些实用的命令行工具。

https://clojars.org/jark

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接