Компилятор 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 в 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