Clojure不需要cljc文件

7

我需要在Clojure(Garden)和ClojureScript(Reagent)之间共享一个命名空间。

当前项目文件夹的结构如下:

src/
  clj/
    name/
      css.clj
  cljs/
    name/
      core.cljs
  cljc/
    name/
      config.cljc
< p > config.cljc 文件有以下命名空间: (ns name.config)

我试图从 clj/name/css.clj 中使用 require 引用此命名空间。

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

然而,这会导致 Garden 出现编译错误。
引发的原因是:java.io.FileNotFoundException: Could not locate name/config__init.class or name/config.clj on classpath.
我猜它甚至没有检查 cljc 文件。
我在 project.clj 和 :garden :builds 的 source-paths 向量中添加了 "src/cljc",但即使重启构建进程,仍然出现相同的错误。
我在 Clojure 1.7.0 和 1.8.0 中看到这种行为。
值得一提的是,在 ClojureScript 中(由 Figwheel 处理构建)可以无问题地工作。我可以轻易地要求和使用新的命名空间。
看起来我必须错过了某些非常简单的东西,因为关于 .cljc 文件的所有文档甚至都没有提到需要它们。
2个回答

5

请检查您的project.clj文件,确保您正在使用Clojure 1.7或更高版本。以下错误信息:

Caused by: java.io.FileNotFoundException: Could not locate name/config__init.class or name/config.clj on classpath.

说明您正在使用Clojure 1.6或更低版本,因为这些版本的Clojure只能寻找.class.clj文件。


1
project.clj 文件中使用了 "1.7.0" 版本的 org.clojure/clojure,当启动 REPL 时,它会确认使用的是 Clojure 1.7.0。是否还需要在 project.clj 中设置其他内容? - Dan Prince
1
我也在使用1.8.0时遇到了同样的问题。 - Dan Prince
你使用的 Leinigen 版本是什么?如果有更新版本的话,你可以尝试一下。 - Timothy Pratley
@DanPrince,你能在某个地方分享你的项目吗? - Daniel Compton

0

我在我的项目中将文件从.clj移动到.cljc时遇到了相同的错误。我尝试了lein clean,但没有效果。最终我重命名了模块命名空间,问题得到了解决。

(我猜测可能存在一些已编译模块的缓存,并且它正在引用一个不再存在的模块,但是由于该名称的模块仍然被缓存,因此cljc未重新编译。)

当我重命名模块命名空间时,代码没有进行其他更改就可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接