我需要在我的Clojure(Garden)和我的ClojureScript(Reagent)之间共享命名空间。
目前项目文件夹如下所示:
src/
clj/
name/
css.clj
cljs/
name/
core.cljs
cljc/
name/
config.cljc
config.cljc
文件具有以下命名空间:(ns name.config)
。
我尝试使用require在clj/name/css.clj
内引用此命名空间。
(ns name.css
(:require [name.config :as config]))
但是,这会导致Garden出现编译错误。
引起:java.io.FileNotFoundException:无法在类路径上找到name / config__init.class或name / config.clj。
我猜它甚至没有检查cljc
个文件。
我将"src/cljc"
添加到:source-paths
和project.clj
中的:garden :builds
向量,但即使重新启动构建过程后,我也会遇到相同的错误。
我在Clojure 1.7.0和1.8.0上看到了这种行为。
值得一提的是,它在ClojureScript中没有问题(使用Figwheel处理构建)。我可以毫无问题地要求并使用新的命名空间。
似乎我必须遗漏一些非常简单的东西,因为.cljc
文件周围的文档都没有提及要求它们。
答案 0 :(得分:5)
检查您project.clj
中是否使用了Clojure 1.7或更高版本。此错误消息:
引起:java.io.FileNotFoundException:无法在类路径上找到name / config__init.class或name / config.clj。
表示您使用的是Clojure 1.6或更低版本,因为这些版本的Clojure只知道查找.class
或.clj
个文件。
答案 1 :(得分:0)
当我在项目中将文件从.clj移动到.cljc时,我遇到了同样的错误。我做了lein clean
,但没有效果。最后我重命名了模块命名空间并修复了它。
(我的猜测是有一些编译模块的缓存,它引用了一个不再存在的模块,但是cljc没有被重新编译,因为该名称的模块仍然被缓存。)
当我重命名模块命名空间时,它没有任何其他代码更改。