2013-03-13 7 views
5

Sto provando a compilare alcune librerie JS che abbiamo con lein-cljsbuild per integrarle nel nostro codice ClojureScript. Per prima cosa ho aggiunto alcuni goog.provide in cima a ciascun file, e i file sono organizzati gerarchicamente in un albero di directory in base al loro spazio dei nomi (come in Java). Questo è namespace abc è in src-js/libs/a/b/c.jsCompilazione di file JS esterni con Cljsbuild in ClojureScript

Ho messo i file JS nella directory principale dei progetti in src-js/libs, e ho il seguente: compilatore opzioni per 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}} 

Nessuno dei file JS viene compilato nel file di applicazione compilato. Cosa c'è che non va?

Ho anche provato a metterli in risorse/closure-js/libs senza successo.

Sto usando lein-cljsbuild 0.3.0.

risposta

4

Innanzitutto, a differenza di quanto suggerito in alcuni testi, non è necessario includere le posizioni delle librerie di chiusura private in qualsiasi istruzione di configurazione del classpath nel project.clj. Quindi, a meno che la directory "src/js" inclusa nell'istruzione "source-paths:" non sia per altri scopi, è possibile rimuoverla.

In secondo luogo, l'unica cosa da aggiungere al tuo project.clj, per includere il tuo codice di chiusura privato, è il riferimento "libs:" che hai fatto; MA a differenza di quello che hai inserito, quel riferimento deve essere a uno specifico file * .js (o file) e non semplicemente una directory. Quindi se la libreria che si desidera utilizzare si trova in un file denominato test.js e risiede nella directory/src/js, la voce libs: sarebbe: "src/js/test.js". Vedere le note di rilascio di cljs-build se si desidera utilizzare l'opzione predefinita di tale plug-in: libs directory.

Terzo, (e sembra che tu lo sappia già, ma questo è quello che mi ha fatto inciampare) se stai usando un REPL supportato dal browser (opzione repl-listen di cljsbuild), non sarai ancora in grado di caricare/reference/usa le risorse della tua libreria privata da quella REPL finché non includi una: require istruzione da qualche parte nel sorgente per il tuo compiled-app.js (es. "(ns testing (: require [myprivatelib])"), ALLORA devi -compile (lein cljsbuild una volta) e ricarica la pagina del tuo browser con un collegamento a compiled-app.js. Questo porta in quella base di codice. In caso contrario, il tuo REPL del browser continuerà a insistere sul fatto che lo spazio dei nomi fornito nella tua biblioteca di chiusura non è definito.

Spero che questo aiuti.

+0

src-js (meno, non barra!) Non è nel classpath, quindi aggiungo per farlo. Non è necessario specificare una particolare libreria, è possibile specificare una directory, funziona ma ho avuto un bug: non ricompila automaticamente il file nella gerarchia. Vedi il bug tracker di cljsbuild. Infine i miei file non sono stati compilati perché a) non erano richiesti in un file cljs. b) c'era un bug con il file contenente i simboli meno/trattino. Vedi anche il bug tracker. – z1naOK9nu8iY5A

+0

Ok davvero, è possibile specificare un'intera directory per compilare i file JS. Come hai menzionato, la directory deve essere specificata con la parola chiave: lib e NOT in: source-path. Nel mio esempio: libs dovrebbe essere "src-js/libs" e quindi funzionerà. – z1naOK9nu8iY5A