2016-02-07 88 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沒有被重新編譯,因爲該名稱的模塊仍然被緩存)。

當我重命名模塊命名空間它的工作,沒有其他更改的代碼。