【问题标题】:ClojureScript compiler can't find namespace/file in same directoryClojureScript 编译器在同一目录中找不到命名空间/文件
【发布时间】:2015-02-05 21:37:21
【问题描述】:

lein cljsbuild 无法找到定义在另一个命名空间/文件旁边的命名空间/文件,除非我确保它们是按特定顺序编译的。

我的目录布局如下:

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

navigation.cljs 有一些东西可以构建 Om 组件以在页面中导航,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

我可以通过从 core.cljs 中删除对 contempo.view.navigation 的所有引用,运行 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

【问题讨论】:

  • 为我工作,没有错误/警告。我怀疑您有循环依赖项或其中一个源文件无法编译。此外,可能值得尝试使用单一源路径"src/cljs/contempo/"
  • 检查了循环依赖关系,将其折叠到只有一个源路径,实际上删除了几乎所有代码,但我仍然得到错误。在这里可以找到一个演示它的小项目:namespace-error-demo.zip
  • 我刚刚下载并编译了演示没有问题。试试lein clean。如果这不起作用,请转到您的 ~/.m2/ 目录并删除您的 Clojurescript 和 Clojure 依赖项,它们可能处于错误状态。

标签: clojurescript


【解决方案1】:

问题最终是:我没有遵守命名空间如何解析的规则。

对于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"]

    【讨论】:

    • 非常感谢!我遇到了完全相同的问题,没有您的评论无法解决!
    猜你喜欢
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    相关资源
    最近更新 更多