Компилаторът на ClojureScript не може да намери пространство от имена/файл в същата директория

lein cljsbuild има проблеми с намирането на пространство от имена/файл, което е дефинирано точно до друго пространство от имена/файл, освен ако не се уверя, че са компилирани в определен ред.

Оформлението на моята директория изглежда така:

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

navigation.cljs има някои неща за изграждане на Om компоненти за навигация из страницата, а 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


person Jonathan    schedule 05.02.2015    source източник
comment
Работи при мен без грешки/предупреждения. Подозирам, че или имате кръгови зависимости, или един от изходните файлове не успява да се компилира. Освен това може да си струва да опитате да използвате единичен изходен път "src/cljs/contempo/"   -  person Jarlax    schedule 06.02.2015
comment
Проверих за кръгови зависимости, свих го само до един изходен път и всъщност премахнах почти целия код, но все още получавам грешката. Малък проект, който го демонстрира, е достъпен тук: namespace-error-demo.zip   -  person Jonathan    schedule 07.02.2015
comment
Току-що изтеглих и компилирах демонстрацията без проблеми. Опитайте с lein clean. Ако това не работи, отидете във вашата директория ~/.m2/ и изтрийте вашите Clojurescript и Clojure зависимости, те може да са в лошо състояние.   -  person sbensu    schedule 07.02.2015


Отговори (2)


Проблемът в крайна сметка беше: не спазвах правилата за това как се разрешават пространствата от имена.

С изходни пътища от src/cljs/contempo/common и src/cljs/contempo/view, ако имам нужда от пространство от имена contempo.view.whatever, компилаторът ще го търси в src/cljs/contempo/common/contempo/view/whatever.cljs и src/cljs/contempo/view/contempo/view/whatever.cljs.

Трябваше да използвам src/cljs като изходна директория. Това, което исках да направя (изпускане на код за дадена страница, която не се нуждаеше от него) беше някак глупаво (тъй като така или иначе щеше да изтегли целия ClojureScript) и сега е правилно адресирано благодарение на правилна поддръжка на Google Closure Module в ClojureScript.

person Jonathan    schedule 10.03.2015

Имах същия проблем през целия ден. В моя случай основната причина беше наличието на .cljs файлове с "-" в името. Открих, че това е проблемът едва след като преминах към 0.0-3030, което предоставя по-добри съобщения за грешка за стриктните правила за пътя на файла до пространството на имената, които имат по-новите версии на компилатора cljs.

Може да опитате да промените :source-paths на ["src/cljs"]

person micimize    schedule 09.03.2015
comment
Много благодаря! Имах абсолютно същия проблем и не можах да го разбера без вашия коментар! - person Victor Marchuk; 23.08.2015