Lein Figwheel编译错误

时间:2016-01-03 22:06:40

标签: clojure clojurescript leiningen figwheel

我大部分时间都在使用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目录中的所有内容都删掉了,然后再去了。我检查了一个新的repo副本,并在那里得到了同样的错误。

错误中唯一有意义的部分是在某个文件的第1行引用 ANALYSIS ERROR - 只是为了我的理智,就在这里。

(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"]]

2 个答案:

答案 0 :(得分:2)

听起来你可能有一些缓存的javascript导致编译失败。有很多事情可能导致这种情况,但是当我更新了一个依赖项以便稍后使用时,我遇到了这个问题版。问题是figwheel没有意识到你的cljs文件取决于更改的依赖版本,因此不会重新编译源代码。

解决方法是运行lein clean。但是,请注意您还需要在project.clj文件中设置:clean-targets键。这个值是运行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将忽略您的添加内容。

答案 1 :(得分:0)

错误最终成为循环依赖,但由于Clojurescript 1.7.170中的错误,分析器没有捕获依赖关系,而是在无限循环中递归分析两个依赖关系(直到堆栈溢出)。

这个bug现在已经在主人身上修复了,但是我会在这里简要介绍一下它是如何被识别的。

  1. 使用standalone Clojurescript compiler确保工具不会吞咽错误。
  2. 使用{:verbose true} option
  3. 进行编译

    请参阅调试输出start以显示循环依赖关系:

    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的未来版本中,您应该获得编译时分析警告,让您知道您的代码具有循环依赖。