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
目录中的所有东西都炸掉了,然后又去了。我检查了一个新的 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"]]
听起来你可能有一些缓存 javascript 导致编译为 fail.There 有很多事情可以导致这个,但我 运行 遇到这个问题时我已经更新了一个依赖项以使用更高版本。问题是 figwheel 没有意识到你的 cljs 文件依赖于更改后的依赖版本,所以 re-compile 源代码也没有。
解决方法是 运行 清洁。但是,请注意,您还需要在 project.clj 文件中设置 :clean-targets 键。该值是您 运行 清理时要清理的目录列表。默认情况下,它只清除低于目标的内容。但是,大多数人倾向于将 javascript 置于 resources/public 之下。我的 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 中修复,但无论如何我都会在此处简要说明它是如何被识别的。
- 使用 standalone Clojurescript compiler 确保工具没有吞下错误。
- 用
{:verbose true}
option. 编译
查看调试输出开始显示循环依赖:
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 的未来版本中,您应该会收到编译时分析警告,让您知道您的代码具有循环依赖。
我用了 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"]]
听起来你可能有一些缓存 javascript 导致编译为 fail.There 有很多事情可以导致这个,但我 运行 遇到这个问题时我已经更新了一个依赖项以使用更高版本。问题是 figwheel 没有意识到你的 cljs 文件依赖于更改后的依赖版本,所以 re-compile 源代码也没有。
解决方法是 运行 清洁。但是,请注意,您还需要在 project.clj 文件中设置 :clean-targets 键。该值是您 运行 清理时要清理的目录列表。默认情况下,它只清除低于目标的内容。但是,大多数人倾向于将 javascript 置于 resources/public 之下。我的 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 中修复,但无论如何我都会在此处简要说明它是如何被识别的。
- 使用 standalone Clojurescript compiler 确保工具没有吞下错误。
- 用
{:verbose true}
option. 编译
查看调试输出开始显示循环依赖:
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 的未来版本中,您应该会收到编译时分析警告,让您知道您的代码具有循环依赖。