2016-02-07 44 views
7

我需要在我的Clojure(花园)和我的ClojureScript(试剂)之间共享一个命名空间。Clojure不需要cljc文件

目前该项目的文件夹看起来像这样:

src/ 
    clj/ 
    name/ 
     css.clj 
    cljs/ 
    name/ 
     core.cljs 
    cljc/ 
    name/ 
     config.cljc 

config.cljc文件具有以下命名空间:(ns name.config)

我试图从clj/name/css.clj的内部引用这个命名空间的require。

(ns name.css 
    (:require [name.config :as config])) 

但是,这会导致Garden发生编译错误。

引起:java.io.FileNotFoundException:找不到名称/ config__init.class或名称/ config.clj在类路径上。

我想这甚至不检查cljc文件。

我加"src/cljc":source-paths向量project.clj:garden :builds,但我甚至重新启动构建过程后得到同样的错误。

我在Clojure 1.7.0和1.8.0上看到了这种行为。

也许值得一提的是它在ClojureScript中没有问题(使用Figwheel处理构建)。我可以要求和使用新的命名空间,而不会有任何问题。

看来我必须错过一些非常简单的事情,因为没有任何关于.cljc文件的文档甚至提到需要它们。

回答

5

检查您的project.clj是否使用Clojure 1.7或更高版本。此错误消息:

导致:java.io.FileNotFoundException:找不到名称/config__init.class或名称/ config.clj在类路径上。

表明您正在使用的Clojure 1.6或以下,如Clojure的这些版本只知道找.class.clj文件。

+1

'project.clj'在''1.7.0''有'org.clojure/clojure',当我启动一个REPL时,它确认'Clojure 1.7.0'。还有什么需要在'project.clj'中设置? –

+1

我也使用1.8.0时遇到同样的问题。 –

+0

您使用的是哪种版本的Leinigen?如果存在,您可以尝试更近的一个。 –

0

我在我的项目中将.clj文件从.clj移动到.cljc时,出现了同样的错误。我做了lein clean但这没有效果。最终我重命名了模块名称空间并修复了它。 (我的猜测是有一些编译模块的缓存,它引用了一个不再存在的模块,但是cljc没有被重新编译,因为该名称的模块仍然被缓存)。

当我重命名模块命名空间它的工作,没有其他更改的代码。