2013-03-13 9 views
5

Ich versuche, einige JS-Bibliotheken zu kompilieren, die wir mit lein-cljsbuild haben, um sie in unsere ClojureScript-Codebasis zu integrieren. Zuerst habe ich etwas goog.provide oben in jeder Datei hinzugefügt, und die Dateien sind hierarchisch in einer Verzeichnisstruktur entsprechend ihrem Namespace organisiert (wie in Java). Das ist Namespace abc ist in src-js/libs/a/b/c.jsKompilieren von externen JS-Dateien mit Cljsbuild in ClojureScript

Ich habe die JS-Dateien in das Stammverzeichnis der Projekte in src-js/libs, und ich habe Folgendes: Compiler Optionen für 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}} 

Keiner der JS-Dateien werden in der kompilierten-App-Datei kompiliert. Was ist los mit dir?

Ich habe auch versucht, sie in Ressourcen/closure-js/libs ohne Erfolg zu setzen.

Ich benutze lein-cljsbuild 0.3.0.

Antwort

4

Erstens müssen Sie, anders als in einigen Texten vorgeschlagen, Ihre privaten Schließbibliotheksspeicherorte nicht in eine Klassenpfadkonfigurationsanweisung in Ihrer project.clj einschließen. Wenn das in Ihrer Anweisung "source-paths:" enthaltene "src/js" -Verzeichnis keinen anderen Zwecken dient, können Sie es entfernen.

Zweitens, die einzige Sache, die Sie Ihrer project.clj hinzufügen, um Ihren privaten Schließungscode einzubringen, ist die "libs:" - Referenz, die Sie gemacht haben; Im Gegensatz zu dem, was Sie eingegeben haben, muss dieser Verweis auf eine bestimmte * .js-Datei (oder Dateien) und nicht nur auf ein Verzeichnis verweisen. Wenn sich die zu verwendende Bibliothek also in einer Datei namens test.js befindet und sich im Verzeichnis/src/js befindet, lautet Ihr Eintrag libs: "src/js/test.js". Beachten Sie die Versionshinweise zu cljs-build, wenn Sie die Standardoption libs des Verzeichnisses verwenden möchten.

Drittens, (und es sieht so aus, als ob Sie das schon wissen, aber das hat mich überfordert) Wenn Sie eine browsergestützte REPL (repl-listen Option von cljsbuild) verwenden, können Sie immer noch nicht laden/referenzieren/verwenden Sie Ihre privaten Bibliotheksressourcen von dieser REPL, bis Sie eine Anweisung include in die Quelle Ihrer kompilierten app.js einfügen (z. B. "(ns testing (: require [myprivatelib]))), DANN müssen Sie re -compile (lein cljsbuild einmal) und laden Sie Ihre Browserseite mit einem Link zu compiled-app.js neu. Dies bringt diese Codebasis mit. Andernfalls besteht Ihre Browser-REPL nur darauf, dass der in Ihrer Schließbibliothek angegebene Namespace nicht definiert ist.

Ich hoffe, das hilft.

+0

src-js (minus, nicht slash!) Ist nicht im Klassenpfad, also füge ich hinzu, um das zu tun. Sie müssen keine bestimmte Bibliothek angeben, Sie können ein Verzeichnis angeben, es funktioniert, aber ich hatte einen Fehler: Es kompiliert nicht automatisch die Datei in der Hierarchie. Siehe den Bugtracker von cljsbuild. Schließlich wurden meine Dateien nicht kompiliert, weil a) sie in einer cljs-Datei nicht benötigt wurden. b) Es gab einen Fehler mit einer Datei, die Minus-/Bindestrichsymbole enthielt. Siehe auch den Bug Tracker. – z1naOK9nu8iY5A

+0

Ok, in der Tat ist es möglich, ein ganzes Verzeichnis anzugeben, um JS-Dateien zu kompilieren. Wie Sie bereits erwähnt haben, muss das Verzeichnis mit dem Schlüsselwort: lib und NICHT im Quellpfad angegeben werden. In meinem Beispiel: libs sollte "src-js/libs" sein und dann funktioniert es. – z1naOK9nu8iY5A