2013-04-14 3 views
1

lein new app ...을 만들었을 때 lein repl에서 함수를 호출 할 때 내 네임 스페이스에서 문제가 없습니다. 그러나 에서 함수를 호출 할 수있는 것 같지 않습니다. 단지 lein new ...을 통해 라이브러리 프로젝트를 만들었습니다. 세부 사항은 다음과 같습니다.lein 앱과 라이브러리의 lein repl 네임 스페이스가 다릅니 까?

lein new app my-app으로 lein 앱을 만든 다음 프로젝트 디렉토리 (project.clj이 들어있는 디렉토리)에서 lein repl을 만듭니다. REPL 네임 스페이스 my-app.core

my-app.core=> 

지금 측 파일에 정의에도 기능의 REPL에서 함수를 호출 할 수 있습니다 나를 떠난다.

my-app.core=> (-main) 
; Hello, world! 
my-app.core=> (my-app.anotherfile/foo) 
; Hey, there; this is foo from anotherfile 

이기만 I core.clj의 NS :require [my-app.anotherfile] 매크로.

좋습니다. 이제 저는 lein 라이브러리와 비슷하게하고 싶습니다. 그래서 lein new my-lib 다음 lein repl, 그리고 나는 user 네임 스페이스에 있어요 :

user=> 

응? 좋아, 잘, 내 LIB 내가

user=> (in-ns 'my-lib.core) 
my-lib.core=> (foo 42) 
; CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:1:1) 

아니

을 시도

(ns my-lib.core) 

(defn foo 
    "I don't do a whole lot." 
    [x] 
    (println x "Hello, World!")) 

(이 leiningen 기본적으로 생성 단지 하나) 내가 호출 할 함수가 포함되어 있습니다. 이건 어때?

user=> (my-lib.core/foo 42) 
; ClassNotFoundException two-files-lib.core java.net.URLClassLoader$1.run (URLClassLoader.java:202 

aha! 다른 오류는 있지만 시력 교정은 아직 없습니다. lein compilelein javac은 아무 것도하지 않는 것 같습니다.

문서 또는 온라인에서 정확한 주문을 찾거나 추론 할 수 없어 충고에 감사드립니다.

답변

3

기본값 인 lein new 프로젝트에서는 require 명시 적으로 사용할 네임 스페이스 - (require 'my-lib.core)이 필요합니다. in-ns은 이미 존재하지 않으면 주어진 이름의 새로운 빈 네임 스페이스를 간단하게 생성합니다. 클래스 패스에서 어떤 코드도로드하지 않습니다.

응용 프로그램 프로젝트는이 작업을 자동으로 수행하고 기본적으로 project.clj:main foo.core 항목이 있으므로 REPL 작업의 기본 네임 스페이스로 전환합니다. 라이브러리에서 사용하는 것이 가능하지만 부작용으로 인해 메인 네임 스페이스의 AOT 컴파일이 발생하지 않아야합니다. 이는 일반적으로 바람직하지 않습니다.

대신 lein2에서 :repl-options {:init-ns my-lib.core}을 사용할 수 있습니다.