명령 줄 인터페이스로 Clojure 앱을 만드시나요?


79

방금 Clojure (Ruby에서 온)로 시작했고 명령 줄 인터페이스가있는 작은 앱을 만들고 싶습니다. CL에 대한 입력 / 출력을 어떻게 처리합니까?

나는 clojure.contrib.command-line이 있다는 것을 알아 챘지만 문서는 희박합니다.

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


9
앱이 자주 실행되는 경우 매번 JVM 시작 비용을 지불해야합니다.
Stuart Sierra

1
와 @StuartSierra하지

답변:


120

다음은 해당 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플래그 로 표시 될 수도 있습니다 . 도움말 정보는 cmdspec에서 자동으로 생성됩니다.

$ 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) 지정되지 않은 인수는 cmdspec 바인딩에 지정된대로 기본값을받습니다. 예를 들어 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]

내가 찾던 것이 굉장했다. 매우 철저합니다. 나는 이것이 구글에서 좋은 순위가되기를 바란다 :)
dMix

1
이것은 실제로 현존하는 가장 멋진 예입니다.
Alex Miller

9
Clojure 1.3의 경우, 아마도 tools.cli (새로운 기여)를 사용하기 시작해야합니다. 참조 dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Gogithub.com/clojure/tools.cli
semperos

33

이전 clojure.contrib. 명령 줄이 tools.cli로 대체되었습니다.

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

tools.cli는 clargon이라고 불렀습니다. 다음은 tools.cli 사용 예제를 제공하는 두 개의 블로그 게시물입니다 (clargon에 대한 모든 참조를 tools.cli로 간단하게 바꾸십시오. 게시물은 오래되었습니다).

이것은 오래된 clojure.contrib.command-line을 포함한 몇 가지 방법을 보여줍니다

원저자가 Clargon에 초점을 맞춘 게시물


12

나는 당신이 할 수있는 것을 추가하고 싶습니다

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

(defn -main ...)해석 모드에서 작동 하도록 하려면 아래에 있습니다.


7

질문이 제기 된 후 오랫동안 docoptCLI 인터페이스를 구축 할 때 라이브러리 사용을 제안 할 수 있습니다. Clojure를위한 것이 있습니다 -docopt.clj

docopt는 프로그램 인터페이스 설명을위한 도움말 메시지와 매뉴얼 페이지에서 수십 년 동안 사용 된 규칙을 기반으로합니다. docopt의 인터페이스 설명은 이러한 도움말 메시지이지만 형식화되었습니다.

따라서 인터페이스 를 선언 하고 동시에 문서화 할 수 있습니다 . 놀랍고도 쉽습니다.

자세한 내용은 http://docopt.org/ 를 확인하는 것이 좋습니다.

또한 인터페이스 http://try.docopt.org/ 를 확인하는 온라인 앱이 있습니다.

마지막으로 Clojure lib를 사용하는 방법의 예가 있습니다.


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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.