Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure Lein Figwheel编译错误_Clojure_Clojurescript_Leiningen_Figwheel - Fatal编程技术网

Clojure Lein Figwheel编译错误

Clojure Lein Figwheel编译错误,clojure,clojurescript,leiningen,figwheel,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 0

我在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行上的分析错误的引用,为了我的理智起见,这里就是

(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文件依赖于更改的依赖版本,因此没有重新编译源代码

解决办法是把莱恩清理干净。但是,请注意,还需要在project.clj文件中设置:clean targets键。该值是运行lein clean时要清理的目录列表。默认情况下,它只清理低于目标的内容。然而,大多数人倾向于将javascript放在resources/public下面。我的项目中有以下内容。clj

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

这基本上是将存储cljsbuild输出的目录添加到:target path中定义的目录集。运行leinclean现在将删除:output dir和:output to中的内容。请注意,您必须包含:protect false值,否则lein将忽略您的添加。

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

这个bug现在已经在master中修复了,但是我会在这里留下一个关于它是如何被识别的概述

  • 使用以确保工具没有吞咽错误
  • 使用
  • 请参见调试输出开始以显示循环依赖项:

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

    删除
    .m2
    不会有任何帮助-工件一旦发布就不可更改。Clojurescript经常错误地缓存部分结果。使用
    lein clean
    获得一个没有任何缓存的新编译。是的,
    lein clean
    首先出现。忘了提了。我今天切换到clojars mirror,想知道一个不可靠的网络连接是否会破坏下载到
    .m2
    。即使在使用更新的目标运行
    lein clean
    ,并手动检查所有构建的JS都已消失之后,当我试图编译时,仍然会出现分析错误。即使我创建了一个全新的项目,然后将现有的src文件夹拉入其中,也会出现这种情况。这样可以保证不会有缓存代码把事情弄糟。我的建议是发布完整的project.clj文件和state.cljs文件。我注意到的一件事是,我们排除了标准的clojure'get'命令-为什么?另一种选择是让你的项目在github上可用,也许我可以克隆它,看看你为什么会出错。我的命名空间公开了一个不同的get方法,不希望它被隐式隐藏。在其他几个人的帮助下,确定了问题并修复了analyzer错误。谢谢你的帮助。