ClojureScript编译器无法在同一目录中找到命名空间/文件

Jon*_*han 6 clojurescript

lein cljsbuild 除非我确保它们按特定顺序编译,否则无法找到与另一个命名空间/文件一起定义的命名空间/文件.

我的目录布局如下所示:

project/
  project.clj
  src/
    cljs/
      contempo/
        common/
          defs.cljs
        view/
          core.cljs
          navigation.cljs
Run Code Online (Sandbox Code Playgroud)

navigation.cljs有一些东西可以构建Om组件来浏览页面,并且core.cljs是这个特定页面的主要入口点.navigation.cljs以..开始:

(ns contempo.view.navigation (:require ...))
Run Code Online (Sandbox Code Playgroud)

core.cljs 以..开始:

(ns contempo.view.core (:require [contempo.view.navigation :as navigation]))
Run Code Online (Sandbox Code Playgroud)

当我跑步时lein cljsbuild,我得到:

solace:Groov jfischer$ lein cljsbuild auto
Compiling ClojureScript.
Compiling "war/view/js/app.js" from ["src/cljs/contempo/common" "src/cljs/contempo/view"]...
Compiling "war/view/js/app.js" failed.
clojure.lang.ExceptionInfo: failed compiling file:src/cljs/contempo/view/core.cljs

... snipped stacktrace ...

Caused by: clojure.lang.ExceptionInfo: No such namespace: contempo.view.navigation at line 1 src/cljs/contempo/view/core.cljs
Run Code Online (Sandbox Code Playgroud)

我可以通过删除所有对contempo.view.navigationcore.cljs的引用,运行lein cljsbuild auto并让编译完成,然后将它们放回并保存(所以cljsbuild获取更改)来实现它,但这很愚蠢,不应该是必要的.

project.clj看起来像:

(defproject contempo "0.0.0-SNAPSHOT"
  :description "Experimenting with ClojureScript and Om"
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.clojure/clojurescript "0.0-2740"]
                 [org.clojure/core.async "0.1.346.0-17112a-alpha"]
                 [org.omcljs/om "0.8.7"]]

  :plugins [[lein-cljsbuild "1.0.4"]]

  :clean-targets ^{:protect false} ["war/view/js/app.js"
                                    "war/view/js/out"]

  :cljsbuild {:builds [{:id "view-dev"
                        :source-paths ["src/cljs/contempo/common"
                                       "src/cljs/contempo/view"]
                        :compiler {:output-to "war/view/js/app.js"
                                   :output-dir "war/view/js/out"
                                   :optimizations :none
                                   :cache-analysis true
                                   :source-map true}}]})
Run Code Online (Sandbox Code Playgroud)

有什么明显的我做错了吗?这看起来与我看过的每个ClojureScript项目非常相似.

更新:显示错误的微小骨架项目在这里:namespace-error-demo.zip

Jon*_*han 6

最后的问题是:我没有遵守命名空间如何解决的规则.

随着源路径src/cljs/contempo/commonsrc/cljs/contempo/view,如果我需要的contempo.view.whatever命名空间,编译器会寻找它在src/cljs/contempo/common/contempo/view/whatever.cljssrc/cljs/contempo/view/contempo/view/whatever.cljs.

我不得不src/cljs用作源目录.我想要实现的目标(省略不需要它的给定页面的代码)有点愚蠢(因为它无论如何都会引入所有ClojureScript)并且由于正确的Google Closure模块支持而现在可以正确处理在ClojureScript中.