2015-02-05 70 views
5

lein cljsbuild在查找与另一个命名空间/文件一起定义的命名空间/文件时遇到问题,除非我确保它们按特定顺序编译。ClojureScript编译器无法在同一目录中找到命名空间/文件

我的目录结构是这样的:

project/ 
    project.clj 
    src/ 
    cljs/ 
     contempo/ 
     common/ 
      defs.cljs 
     view/ 
      core.cljs 
      navigation.cljs 

navigation.cljs有一些东西来构建嗡组件页面各处导航和core.cljs是这个特定页面的主入口点。 navigation.cljs打头:

(ns contempo.view.navigation (:require ...)) 

core.cljs打头:

(ns contempo.view.core (:require [contempo.view.navigation :as navigation])) 

当我运行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 

我可以得到它通过删除所有引用contempo.view.navigation工作core.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}}]}) 

有什么明显我做错了吗?这看起来很像我看过的每个ClojureScript项目。

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

+0

适用于我,没有错误/警告。我怀疑你是否有循环依赖或者其中一个源文件无法编译。另外,可能值得尝试使用单一源代码路径'“src/cljs/contempo /”' – Jarlax 2015-02-06 12:26:33

+0

检查循环依赖关系,将它折叠为只有一个源代码路径,并且实际上删除了几乎所有的代码,而且我仍然得到错误。 一个很小的项目,演示它可以在这里找到:[namespace-error-demo.zip](http://www.mohiji.org/files/namespace-error-demo。zip) – Jonathan 2015-02-07 00:40:53

+1

我刚刚下载和编译演示没有问题。试着用'lein clean'。如果这不起作用,进入你的'〜/ .m2 /'目录并删除你的Clojurescript和Clojure依赖项,它们可能会处于不良状态。 – sbensu 2015-02-07 13:23:45

回答

4

问题结束了:我不服从的命名空间是如何解决的规则。

随着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中使用),现在可以通过proper Google Closure Module support in ClojureScript正确解决。

2

我有同样的问题今天的一切。在我的情况下,根本原因是名称中带有“ - ”的.cljs文件。我只是在切换到0.0-3030后才发现这是问题,它为更严格的文件路径提供了更好的错误消息,使命名空间约定符合更新版本的cljs编译器的要求。

你可能想尝试改变:source-paths["src/cljs"]

+0

非常感谢!我有完全相同的问题,没有你的评论无法弄清楚! – 2015-08-23 13:40:07

相关问题