我有一个用茉莉花来测试JavaScript的项目。我正试图切换到前端使用ClojureScript。我的project.clj就像
(defproject myproject "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.5.1"]
[org.clojure/clojurescript"0.0-1889"]
[org.clojure/google-closure-library-third-party "0.0-2029"]
[domina "1.0.0"]
[hiccups "0.2.0"]]
:plugins [[lein-cljsbuild "0.3.3"]]
:cljsbuild {
:builds [{
:source-paths ["src/clojurescript"]
:compiler {
:output-to "public/javascripts/main.js"
:optimizations :whitespace
:pretty-print true}}
{
:source-paths ["spec/clojurescript"]
:compiler {
:output-to "spec/javascripts/mainSpec.js"
:optimizations :whitespace
:pretty-print true}}]})因此,.cljs中的所有src/clojurescript文件都被编译成main.js,而spec/clojurescript中的所有.cljs都被编译成mainSpec.js。当我加载Jasmine页面时,两个.js文件都被加载,但是测试没有运行。在控制台中,我得到一个Error: Namespace "goog.debug.Error" already declared.,两个.js文件的顶部都有相同的30k行谷歌闭包代码,这导致了错误。如果我从mainSpec.js中删除这段代码,它就运行得很好。有没有办法告诉cljsbuild将这些代码从规范文件中删除?
发布于 2013-10-20 22:43:04
正如Jared314和Zubair所指出的,您所遇到的问题是由于试图在同一个页面中包含两个clojurescript编译输出而造成的。Clojurescript/Google闭包期望做一个“整个世界”的编译,也就是说,编译器希望整个页面的所有代码都传递给编译器,这样它就可以优化它,重命名函数,并最终输出一个javascript文件。它不是为了产生多个一起工作的输出文件而设计的。
解决问题的“正确”方法是产生两个单独使用的输出:一个用于运行应用程序的main.js文件和一个包含主程序中所有代码的spec.js文件,以及用于测试的规范中的代码。您可以通过设置项目来做到这一点,如下所示:
:cljsbuild {
:builds [{
:source-paths ["src/clojurescript"]
:compiler {:output-to "public/javascripts/main.js"}}
{
:source-paths ["src/clojurescript" "spec/clojurescript"]
:compiler {:output-to "spec/javascripts/spec.js"}}]})您的茉莉页面应该引用spec.js,而不是main.js --两者都是导致错误的原因。
发布于 2013-09-24 23:55:29
问题是,这两个构建都包含了Google闭包库,因此出现了“已经声明”的错误。您可以尝试在:optimizations :advanced选项中使用:compiler,以减少或消除重复代码。
但是,如果仍然遇到相同的问题,您可能希望将src和spec一起编译到mainSpec.js构建中。
https://stackoverflow.com/questions/18987333
复制相似问题