同一页面上有多个ClojureScript文件

时间:2013-09-24 16:39:40

标签: clojurescript cljsbuild

我有一个使用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文件之外?

2 个答案:

答案 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版本编译specmainSpec.js