2015-02-05 61 views
5

lein cljsbuild在查找與另一個命名空間/文件一起定義的命名空間/文件時遇到問題,除非我確保它們按特定順序編譯。ClojureScript編譯器無法在同一目錄中找到命名空間/文件

我的目錄結構是這樣的:

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

navigation.cljs有一些東西來構建嗡組件頁面各處導航和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 

我可以得到它通過刪除所有引用contempo.view.navigation工作core.cljs,運行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

+0

適用於我,沒有錯誤/警告。我懷疑你是否有循環依賴或者其中一個源文件無法編譯。另外,可能值得嘗試使用單一源代碼路徑'「src/cljs/contempo /」' – Jarlax 2015-02-06 12:26:33

+0

檢查循環依賴關係,將它摺疊爲只有一個源代碼路徑,並且實際上刪除了幾乎所有的代碼,而且我仍然得到錯誤。 一個很小的項目,演示它可以在這裏找到:[namespace-error-demo.zip](http://www.mohiji.org/files/namespace-error-demo。zip) – Jonathan 2015-02-07 00:40:53

+1

我剛剛下載和編譯演示沒有問題。試着用'lein clean'。如果這不起作用,進入你的'〜/ .m2 /'目錄並刪除你的Clojurescript和Clojure依賴項,它們可能會處於不良狀態。 – sbensu 2015-02-07 13:23:45

回答

4

問題結束了:我不服從的命名空間是如何解決的規則。

隨着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"]

+0

非常感謝!我有完全相同的問題,沒有你的評論無法弄清楚! – 2015-08-23 13:40:07

相關問題