2013-03-13 6 views
5

lein-cljsbuild와 함께있는 JS 라이브러리를 컴파일하여 ClojureScript 코드 기반에 통합하려고합니다. 먼저 각 파일의 상단에 goog.provide를 추가했으며 파일은 Java와 마찬가지로 네임 스페이스에 따라 디렉토리 트리에 계층 적으로 구성되어 있습니다. 그것은 네임 스페이스입니다. abc는 src-js/libs/a/b/c.js에 있습니다.ClojureScript에서 Cljsbuild를 사용하여 외부 JS 파일 컴파일

src-js/libs에있는 프로젝트의 루트 디렉토리에 JS 파일을 넣었습니다. lein-cljsbuild 옵션 :

{:id "prod", 
:source-paths ["src-cljs" "src-js"] 
:compiler 
{:pretty-print false, 
    :libs ["libs/"] 
    :output-to "resources/public/js/compiled-app.js", 
    :optimizations :simple}} 

아무 것도 컴파일 된 응용 프로그램 파일로 컴파일되지 않습니다. 뭐가 문제 야?

나는 리소스/closure-js/libs에 성공하지 못했습니다.

저는 lein-cljsbuild 0.3.0을 사용하고 있습니다.

답변

4

먼저 일부 텍스트에서 제안한 것과 달리 private closure 라이브러리 위치를 project.clj의 클래스 경로 구성 문에 포함시킬 필요가 없습니다. 따라서 "source-paths :"문에 포함 된 "src/js"디렉토리가 다른 목적을위한 것이 아니면 제거 할 수 있습니다.

둘째, private closure 코드를 가져 오기 위해 project.clj에 추가 할 수있는 유일한 것은 "libs :"참조입니다. 하지만 입력 한 내용과 달리 참조는 단순히 디렉토리가 아닌 특정 * .js 파일 (또는 파일)이어야합니다. 따라서 사용하려는 라이브러리가 test.js라는 파일에 있고 그 디렉토리가/src/js 디렉토리에 있다면 libs : 항목은 "src/js/test.js"가됩니다. 해당 플러그인의 default : libs 디렉토리 옵션을 사용하려면 cljs-build 릴리스 노트를 참조하십시오.

셋째, 브라우저가 지원되는 REPL (cljsbuild의 repl-listen 옵션)을 사용하는 경우 셋째, (이미 알고있는 것처럼 보이지만이게 내 트로피 한 것입니다.) 여전히로드 할 수 없습니다/refer/컴파일 된 app.js의 소스에 어딘가에 : require 문을 넣을 때까지 해당 REPL에서 개인 라이브러리 자산을 사용하십시오 (예 : "(ns testing (: require [myprivatelib])"), -compile (한 번 클릭하면 cljsbuild) 컴파일 된 app.js 링크가있는 브라우저 페이지를 다시로드하십시오. 이것은 코드베이스를 가져온다. 그렇지 않으면 브라우저 REPL은 클로저 라이브러리에 제공된 네임 스페이스가 정의되어 있지 않다고 계속 주장합니다.

이 정보가 도움이되기를 바랍니다.

+0

src-js (빼기, 슬래시!)가 클래스 경로에 없으므로 추가해야합니다. 특정 라이브러리를 지정할 필요가 없습니다. 디렉토리를 지정할 수는 있지만 작동하지만 버그가 있습니다. 계층 구조의 파일을 자동으로 다시 컴파일하지 않습니다. cljsbuild의 버그 추적기를보십시오. 마지막으로 내 파일은 컴파일되지 않았기 때문에 a) cljs 파일에 필요하지 않았기 때문입니다. b) 마이너스/하이픈 기호가 포함 된 파일이있는 버그가있었습니다. 버그 추적기도 참조하십시오. – z1naOK9nu8iY5A

+0

실제로 JS 파일을 컴파일하기 위해 전체 디렉토리를 지정할 수 있습니다. 언급 한대로 디렉토리는 : source-path가 아닌 : lib 키워드로 지정해야합니다. 내 예제에서는 : libs "src-js/libs"있어야하며 다음 작동합니다. – z1naOK9nu8iY5A