Я был с figwheel большую часть дня, а затем внезапно после перезапуска (не первого) он начал не компилироваться.

Я получаю следующее сообщение, когда запускаю lein figwheel.

Figwheel: Starting server at http://localhost:3449
Figwheel: Watching build - dev
[0mCompiling "resources/public/js/compiled/game.js" from ["src"]...
{:file #object[java.net.URL 0x79b3937a "file:/home/dan/dev/org/danjoe/game/src/game/state.cljs"], :line 1, :column 1, :tag :cljs/analysis-error}
ANALYSIS ERROR:  at line 1 file:/home/dan/dev/org/danjoe/game/src/game/state.cljs on file file:/home/dan/dev/org/danjoe/game/src/game/state.cljs, line 1, column 1
Subprocess failed

Я проверил некоторый стабильный код ранее, но он все еще не работает.

Я уничтожил все в моем каталоге ~/.m2 и пошел снова. Я проверил новую копию репо и получил там ту же ошибку.

Единственная значимая часть ошибки - это ссылка на ANALYSIS ERROR в строке 1 какого-то файла - просто ради моего здравого смысла, вот она.

(ns game.state
  (:refer-clojure :exclude [get])
  (:require [reagent.core :as reagent]
            [game.views.heroes :as default-view]))

Если я перейду к этому файлу и намеренно разорву пространство имен (переключу его на что-то некорректное), а затем снова запустите lein figwheel, ошибка анализа просто переключится на другой файл в моем проекте. Если я нарушу все пространства имен, он начнет выдавать ошибки анализа для строки 2 (или где бы то ни было следующее s-выражение).

Вот зависимости проекта.

:dependencies [[org.clojure/clojure "1.7.0"]
              [org.clojure/clojurescript "1.7.170"]
              [org.clojure/core.async "0.2.374"]
              [reagent "0.5.0"]
              [secretary "1.2.0"]]

И плагины, которые я использую.

  :plugins [[lein-cljsbuild "1.1.1"]
           [lein-figwheel "0.5.0-1"]]
1
Dan Prince 4 Янв 2016 в 01:06

2 ответа

Лучший ответ

Ошибка оказалась циклической зависимостью, но из-за ошибки в Clojurescript 1.7.170 анализатор не улавливал зависимость и вместо этого рекурсивно анализировал обе зависимости в бесконечном цикле (до тех пор, пока стек не переполнился).

Ошибка теперь исправлена ​​в мастере, но я все равно оставлю здесь краткое изложение того, как она была обнаружена.

  1. Используйте автономный компилятор Clojurescript, чтобы убедиться, что инструмент не принимает ошибок.
  2. Выполните компиляцию с помощью параметра {:verbose true}.

Смотрите начало отладки, чтобы показать циклическую зависимость:

Reading analysis cache for jar:file:/home/dan/Downloads/cljs.jar!/cljs/core.cljs
Compiling src/game/ui/widgets.cljs
Analyzing file:/tmp/lispjam/src/game/state.cljs
Analyzing file:/tmp/lispjam/src/game/views/heroes.cljs
Analyzing file:/tmp/lispjam/src/game/state.cljs
Analyzing file:/tmp/lispjam/src/game/views/heroes.cljs
Analyzing file:/tmp/lispjam/src/game/state.cljs
Analyzing file:/tmp/lispjam/src/game/views/heroes.cljs
Analyzing file:/tmp/lispjam/src/game/state.cljs
Analyzing file:/tmp/lispjam/src/game/views/heroes.cljs
Analyzing file:/tmp/lispjam/src/game/state.cljs
Analyzing file:/tmp/lispjam/src/game/views/heroes.cljs
Analyzing file:/tmp/lispjam/src/game/state.cljs
...

Разрешение циклической зависимости устранило все, но в будущих версиях Clojurescript вы должны получить предупреждение анализа времени компиляции, сообщающее, что ваш код имеет циклическую зависимость.

0
Dan Prince 7 Янв 2016 в 03:10

Похоже, у вас может быть кешированный javascript, который вызывает сбой компиляции. Есть много вещей, которые могут вызвать это, но я столкнулся с этой проблемой, когда обновил зависимость для использования более поздней версии. Проблема в том, что figwheel не понимает, что ваш файл cljs зависит от измененной версии зависимости, поэтому не перекомпилирует исходный код.

Исправление - запустить lein clean. Однако обратите внимание, что вам также необходимо установить ключ: clean-target в файле project.clj. Значение Thie - это список каталогов, которые нужно очистить при запуске lein clean. По умолчанию он просто очищает то, что ниже целевого. Однако большинство людей склонны размещать свой javascript ниже ресурсов / общедоступных. В моем проекте project.clj есть следующее

:clean-targets ^{:protect false} [:target-path
                                    [:cljsbuild :builds :app :compiler
                                     :output-dir]
                                    [:cljsbuild :builds :app :compiler
                                     :output-to]]

Который в основном добавляет каталоги, в которых я храню вывод cljsbuild, в набор каталогов, определенных в: target-path. Запуск lein clean теперь удалит все, что находится в: output-dir и: output-to. Обратите внимание, что вы должны включить значение: protect false, иначе lein проигнорирует ваши добавления.

2
Tim X 3 Янв 2016 в 22:35