4

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 にこのコードをスペック ファイルから除外するように指示する方法はありますか?

4

2 に答える 2

1

Jared314 と Zubair が指摘したように、発生している問題は、2 つの clojurescript コンパイル出力を同じページに含めようとしたことが原因です。Clojurescript/Google Closure は、「全世界」のコンパイルを行うことを想定しています。つまり、コンパイラは、ページ全体のすべてのコードがコンパイラに渡されることを想定しています。単一の JavaScript ファイル。一緒に機能する複数の出力ファイルを生成するようには設計されていません。

問題を解決する「正しい」方法は、分離して使用される 2 つの出力を生成することです。アプリケーションを実行するための main.js ファイルと、main のすべてのコードとテスト用の spec のコードを含む 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 は参照しないでください。両方を参照するとエラーが発生します。

于 2013-10-20T22:43:04.910 に答える
0

問題は、両方のビルドが Google Closure ライブラリを含めてコンパイルされているため、「既に宣言されている」というエラーが発生することです。オプションで を使用して、重複するコードを削減または排除することができ:optimizations :advancedます:compiler

ただし、それでも同じ問題が発生する場合は、ビルドのためにsrcand をspec一緒にコンパイルすることをお勧めします。mainSpec.js

于 2013-09-24T23:55:29.740 に答える