繁体   English   中英

Lein Figwheel编译错误

[英]Lein Figwheel Compile Error

我一天中大部分时间都在使用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目录中的所有内容,然后又去了一次。 我签出了回购的新副本,并在那里出现相同的错误。

错误的唯一有意义的部分是对某些文件的第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"]]

听起来您可能有一些缓存的JavaScript会导致编译失败。有很多原因会导致此失败,但是当我更新依赖项以使用更高版本时,我就遇到了这个问题。 问题在于,Figwheel无法实现您的cljs文件依赖于更改后的依赖版本,因此不会重新编译源代码。

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

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

该错误现在已在master中修复,但无论如何我将在此对其进行分类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM