我有一个使用Jasmine来测试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
,而.cljs
中的所有spec/clojurescript
都会汇编到mainSpec.js
。
当我加载Jasmine页面时,.js
文件都被加载但测试没有运行。
在控制台中,我得到Error: Namespace "goog.debug.Error" already declared.
.js
个文件在顶部都有相同的~30k行google封闭代码,导致错误。如果我从mainSpec.js
删除此代码,它运行正常。
有没有办法告诉cljsbuild将此代码保留在spec文件之外?
答案 0 :(得分:1)
正如Jared314和Zubair指出的那样,您遇到的问题是由于尝试在同一页面中包含两个clojurescript编译输出而引起的。 Clojurescript / Google Closure期望进行“全世界”编译,也就是说,编译器期望将整个页面的所有代码传递给编译器,以便它可以优化它,重命名函数,并最终吐出一个单个javascript文件。它不是为了生成多个可以协同工作的输出文件而设计的。
解决问题的'正确'方法是生成两个独立使用的输出:一个用于运行应用程序的main.js文件,一个包含main中所有代码的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"}}]})
你的jasmine页面应该引用spec.js而不是main.js - 两者都是你错误的原因。
答案 1 :(得分:0)
问题是两个版本都是在包含Google Closure库的情况下编译的,因此"已经宣布"错误。您可以尝试在:optimizations :advanced
选项中使用:compiler
来减少或消除重复的代码。
但是,如果您仍然遇到同样的问题,您可能希望一起为src
版本编译spec
和mainSpec.js
。