2013-01-16 1 views
3

신참 Clojure의 및 leiningen 질문 ("무엇인가"- 주요) :차이 및 lein 실행 "뭔가")

: 이것은 lein repl을에서 작동 아래에있는 내 프로젝트에서 코드 조각을 감안할 때

==> (-main "something") 

는 예상 "명령 : 뭔가 ... 실행 ... 다"생산 을하지만, 명령 줄에서 작동하지 않습니다 뭔가 :

me pallet1]lein run "something" 

"는 명령을 생성합니다. .. 오류 : 명령으로 해결되지 않음 "

왜?/어떻게 해결할 수 있습니까? 메인 함수를 정의 :main eg.core을 추가

lein new eg 

그런 다음 생성 된 프로젝트 파일을 편집하고 생성 된 SRC/예/core.clj 파일을 편집하고이를 붙여 넣습니다 :

재현하려면

그런 다음

(ns eg.core) 
(defn something [] (println "Something!")) 

(defn run-command-if-any [^String commandname] 
    (printf "Command: %s ..." commandname) 
    (if-let [cmd (ns-resolve *ns* (symbol commandname))] 
     (
     (println "running ...") (cmd) (println "done.") 
    ) 
     (println "error: not resolved as a command.") 
    )) 
(defn -main [ commandname ] (run-command-if-any commandname)) 

lein repl 
eg.core=> (-main "something") 
을 core.clj 16,

작업 (예 : 인쇄 "(오류! 뭔가),하지만하지 않습니다 lein 실행 뭔가 즉,은을 인쇄합니다"없습니다 해결 "메시지)

+0

무엇인가? 어디에서 정의 할 수 있습니까?그것이 당신의 clj 파일에없고 당신이 clj 파일을 읽기 때문에'lein run'을 실행하는 것은 repl에 정의되어 있습니다. –

+0

REPL에서 두 코드를 모두 실행하면 "해결되지 않음"이 표시됩니다. –

+1

Nikita가 말한 것처럼 repl/something이 예제 코드에 정의되어 있지 않습니다. 또한, 그것을 정의하더라도, (println "running") 결과를 호출하려고하기 때문에 NullPointerException이 발생합니다. –

답변

5

문제는 당신이 당신의 기본 네임 스페이스를 lein에서 실행 할 때이다 "사용자"네임 스페이스 :

(defn -main [ commandname ] (println *ns*)) 

인쇄 #<Namespace user>입니다. 그래서 그것은 다른 네임 스페이스에서 왔기 때문에 something 함수를 포함하지 않습니다.

  1. 패스 완전한 함수 이름 : 대신 somethingyour-namespace/something 당신은 몇 가지 선택이있다.
  2. 사용 your-namespace 대신 *ns* : -mainyour-namespace-(ns-resolve 'your-namespace (symbol commandname))
  3. 변경 네임 스페이스. 방법 3

예 : 또한

(defn -main [ commandname ] 
    (in-ns 'your-namespace) 
    (run-command-if-any commandname)) 

당신은 몇 가지 기능을 사용합니다 하나 하나를 호출 할 경우 수행 :

(do (println "Hello") 
    (println "World")) 

을 다만 ((println "hello") (println "World"))

+0

완벽합니다. 감사합니다. –

2
처럼 중괄호

lein exec plugin은 프로젝트 컨텍스트에서 이러한 것들을 스크립팅하는 데 매우 유용합니다. 나는 이것을 클로저 (clojure)와 다른 스크립팅 상황에서 젠킨스 작업에 광범위하게 사용했다.

lein exec -pe '(something ...) (something-else) (save-results)'