Eine Clojure-App mit einer Befehlszeilenschnittstelle erstellen?

79

Ich habe gerade mit Clojure (von Ruby) angefangen und möchte eine kleine App mit einer Befehlszeilenschnittstelle erstellen. Wie gehe ich mit der Eingabe / Ausgabe in einen CL um?

Ich habe festgestellt, dass es eine clojure.contrib.command-Zeile gibt, aber die Dokumentation ist schmal.

http://github.com/richhickey/clojure-contrib/blob/ffa868411cda6c617105b52b4f6f9e0f37ee8c24/src/clojure/contrib/command_line.clj

dMix
quelle
9
Beachten Sie, dass Sie die JVM-Startkosten jedes Mal bezahlen, wenn Ihre App häufig ausgeführt wird.
Stuart Sierra
1
@ StuartSierra Nicht mit Tropfen
Ben

Antworten:

120

Hier ist ein Beispiel für die Verwendung des with-command-lineMakros. Der folgende Code gibt eine triviale Klasse mit einer Hauptmethode an, die nichts anderes tut, als die Werte ihrer Befehlszeilenargumente auszudrucken.

(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)))

Kompilieren Sie die Klasse in der REPL:

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

Anwendungsbeispiel

1) Wenn Sie keine Befehlszeilenargumente ausführen, werden die Hilfeinformationen angezeigt. Die Hilfeinformationen können auch mit --helpoder -hFlags angezeigt werden. Beachten Sie, dass die Hilfeinformationen automatisch aus Ihrer cmdspec generiert werden.

$ 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) Nicht angegebene Argumente erhalten den in der cmdspec-Bindung angegebenen Standardwert. Hat beispielsweise bareinen Standardwert von 2.

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

3) Boolesche Flags werden mit dem Suffix "?" in der cmdspec. Beachten Sie, dass die Flagge selbst nicht nicht enthalten das „?“ als Teil seines Namens.

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

4) Beachten Sie auch, dass Sie Flag-Aliase angeben können, indem Sie mehrere Symbole in der cmdspec angeben. Ich habe das mit den boolean?und b?Flags gemacht.

5) Schließlich habe ich angegeben, dass remainingalle verbleibenden Argumente ohne zugehörige Flags erfasst werden.

$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo:  test
bar:  2
boolean?:  nil
remaining:  [file1 file2 file3]
Alanlcode
quelle
Genial, genau das habe ich gesucht. Sehr ausführlich. Ich hoffe, dass dies bei Google gut rangiert :)
dMix
1
Dies ist in der Tat das beeindruckendste Beispiel dafür.
Alex Miller
9
Für Clojure 1.3 sollten Benutzer wahrscheinlich tools.cli (neuer Beitrag) verwenden. Siehe dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go und github.com/clojure/tools.cli
semperos
33

Die alte Befehlszeile clojure.contrib.command wurde durch tools.cli ersetzt.

https://github.com/clojure/tools.cli

tools.cli hieß früher clargon. Im Folgenden finden Sie zwei Blog-Beiträge mit Beispielen für die Verwendung von tools.cli (ersetzen Sie einfach alle Verweise auf clargon durch tools.cli. Beiträge sind veraltet).

Dies zeigt einige Methoden, einschließlich der alten clojure.contrib.command-Zeile

Beitrag über Clargon vom Originalautor

Jake McCrary
quelle
12

Ich möchte hinzufügen, dass Sie tun können

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

unter dem (defn -main ...), damit es im interpretierten Modus funktioniert.

Pepijn
quelle
7

Lange nachdem die Frage aufgeworfen wurde, kann ich vorschlagen, docoptBibliotheken zu verwenden, wenn es darum geht, eine CLI-Schnittstelle zu erstellen. Es gibt eine für Clojure -docopt.clj

docopt basiert auf Konventionen, die seit Jahrzehnten in Hilfemeldungen und Manpages zur Beschreibung der Programmschnittstelle verwendet werden. Die Beschreibung der Benutzeroberfläche in docopt ist eine solche Hilfemeldung, jedoch formalisiert

So können Sie Ihre Benutzeroberfläche deklarieren und gleichzeitig dokumentieren - das ist erstaunlich und einfach.

Weitere Informationen finden Sie unter http://docopt.org/.

Es gibt auch eine Online-App, mit der Sie Ihre Benutzeroberfläche überprüfen können. Http://try.docopt.org/

Und zum Schluss hier mein Beispiel, wie die Clojure lib verwendet werden kann.

Signalpillar
quelle
1

Vielleicht versuchen Sie es mit Jark. Jark ist ein Tool zum Ausführen von Clojure-Programmen auf einer dauerhaften JVM. Es verfügt über einige nützliche Befehlszeilenprogramme.

https://clojars.org/jark

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