2013-03-13 18 views
5

Próbuję skompilować niektóre biblioteki JS, które mamy z lein-cljsbuild, aby zintegrować je z naszą bazą kodu ClojureScript. Najpierw dodałem plik goog.provide w górnej części każdego pliku, a pliki są hierarchicznie zorganizowane w drzewie katalogów zgodnie z ich przestrzenią nazw (jak w Javie). To jest przestrzeń nazw abc w src-js/libs/a/b/c.jsKompilowanie zewnętrznych plików JS z Cljsbuild w ClojureScript

Umieściłem pliki JS w katalogu głównym projektów w src-js/libs, a mam następujące: kompilator opcje dla 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}} 

Żaden z plików JS nie jest wkompilowany w plik skompilowanej aplikacji. Co jest nie tak?

Próbowałem również umieścić je w zasobach/closure-js/libs bez powodzenia.

Używam lein-cljsbuild 0.3.0.

Odpowiedz

4

Po pierwsze, w przeciwieństwie do sugestii w niektórych tekstach, nie ma potrzeby umieszczania prywatnych lokalizacji biblioteki zamknięcia we wszystkich instrukcjach konfiguracji classpath w pliku project.clj. Więc jeśli katalog "src/js" zawarty w Twojej instrukcji "source-paths:" nie jest dla jakiegoś innego celu, możesz go usunąć.

Po drugie, jedyną rzeczą, którą można dodać do swojego projektu.clj, ze względu na wprowadzenie prywatnego kodu zamknięcia, jest referencja "libs:"; ALE w przeciwieństwie do tego, co wprowadziłeś, odwołanie to musi dotyczyć określonego pliku * .js (lub plików), a nie tylko katalogu. Jeśli więc biblioteka, której chcesz użyć, znajduje się w pliku o nazwie test.js i znajduje się w katalogu/src/js, twój wpis libs: będzie następujący: "src/js/test.js". Zobacz informacje o wersji cljs-build, jeśli chcesz użyć domyślnej opcji tego katalogu: libs.

Po trzecie, (i wygląda na to, że już to wiesz, ale to mnie poturbowało), jeśli korzystasz z REPL opartego na przeglądarkach (opcja cl -build w repl-listen), nadal nie będziesz w stanie załadować/odwołaj/używaj swoich zasobów biblioteki prywatnej z tego REPL aż do włączenia instrukcji: require gdzieś w źródle dla twojego compiled-app.js (np. "(ns testing (: require [myprivatelib])"), WTEDY musisz ponownie -compile (lein cljsbuild once) i ponownie załaduj stronę przeglądarki za pomocą linku do compiled-app.js. To wprowadza tę podstawę kodu. W przeciwnym razie REPL po prostu będzie nalegać, że przestrzeń nazw podana w bibliotece zamknięcia nie jest zdefiniowana.

Mam nadzieję, że to pomoże.

+0

src-js (minus, bez ukośnika!) Nie znajduje się w ścieżce klas, więc dodam do tego. Nie musisz określać konkretnej biblioteki, możesz określić katalog, działa, ale mam błąd: nie rekompiluje automatycznie pliku w hierarchii. Zobacz narzędzie do śledzenia błędów w cljsbuild. W końcu moje pliki nie zostały skompilowane, ponieważ a) nie były wymagane w pliku cljs. b) wystąpił błąd związany z plikiem zawierającym symbole minus/łącznik. Zobacz także moduł do śledzenia błędów. – z1naOK9nu8iY5A

+0

Ok naprawdę możliwe jest określenie całego katalogu do kompilacji plików JS. Jak już wspomniano, katalog musi być określony za pomocą: lib słowa kluczowego i NIE w: source-path. W moim przykładzie: libs powinno być "src-js/libs", a następnie działa. – z1naOK9nu8iY5A

Powiązane problemy