2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面,了解更多此平台的信息。

0
ClojureScript

在 CLJS-1196 的问题上后续出现了,但我无法让其工作。

在版本 0.0-3264 中,lein-cljsbuild 在奇特的异常 Caused by: java.lang.IllegalArgumentException: No implementation of method: :make-reader of protocol: `'clojure.java.io/IOFactory' found for class: nil" 上崩溃,但当前版本 0.0-3269 仍然给出与之前相同的失败的断言。

我已经上传了一个示例项目来说明这个问题。

重现步骤

git clone https://github.com/tillda/stackone
cd stackone
git checkout 537e5c69b844bc53c159e85cafc24310543cc918
lein clean && lein cljsbuild once temp

期望行为:成功编译 cljs,并包含 src/vendor/client/closure.js 和 env/stackone/helpersjs.js。

实际行为

`
编译 "resources/public/lein-cljsbuild-temp/dev-mode-deps.js" 失败。
主线程中发生异常 java.lang.AssertionError: Assert failed: (or (file? x) (url? x) (string? x)), compiling:(/private/var/folders/ym/l2qxd7l97kzfzftrdpqsclm40000gn/T/form-init3642888309490821030.clj:1:125)

at clojure.lang.Compiler.load(Compiler.java:7249)
at clojure.lang.Compiler.loadFile(Compiler.java:7175)
at clojure.main$load_script.invoke(main.clj:275)
at clojure.main$init_opt.invoke(main.clj:280)
at clojure.main$initialize.invoke(main.clj:308)
at clojure.main$null_opt.invoke(main.clj:343)
at clojure.main$main.doInvoke(main.clj:421)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:383)
at clojure.lang.AFn.applyToHelper(AFn.java:156)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)

由以下引起:java.lang.AssertionError: Assert failed: (or (file? x) (url? x) (string? x))

at cljs.util$ext.invoke(util.cljc:115)
at cljs.closure$source_on_disk.invoke(closure.clj:1206)
at cljs.closure$output_unoptimized$fn__3708.invoke(closure.clj:1235)
at clojure.core$map$fn__4551.invoke(core.clj:2622)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4126.invoke(core.clj:135)
at clojure.core$filter$fn__4578.invoke(core.clj:2677)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4126.invoke(core.clj:135)
at clojure.core$map$fn__4551.invoke(core.clj:2614)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.next(RT.java:674)
at clojure.core$next__4110.invoke(core.clj:64)
at clojure.core$str$fn__4186.invoke(core.clj:528)
at clojure.core$str.doInvoke(core.clj:526)
at clojure.lang.RestFn.applyTo(RestFn.java:139)
at clojure.core$apply.invoke(core.clj:628)
at cljs.closure$deps_file.invoke(closure.clj:1040)
at cljs.closure$output_deps_file.invoke(closure.clj:1060)
at cljs.closure$output_unoptimized.doInvoke(closure.clj:1243)
at clojure.lang.RestFn.applyTo(RestFn.java:139)
at clojure.core$apply.invoke(core.clj:630)
at cljs.closure$build.invoke(closure.clj:1514)
at cljs.closure$build.invoke(closure.clj:1426)
at cljsbuild.compiler$compile_cljs$fn__3884.invoke(compiler.clj:81)
at cljsbuild.compiler$compile_cljs.invoke(compiler.clj:80)
at cljsbuild.compiler$run_compiler.invoke(compiler.clj:187)
at user$eval4018$iter__4054__4058$fn__4059$fn__4077.invoke(form-init3642888309490821030.clj:1)
at user$eval4018$iter__4054__4058$fn__4059.invoke(form-init3642888309490821030.clj:1)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.RT.seq(RT.java:507)
at clojure.core$seq__4126.invoke(core.clj:135)
at clojure.core$dorun.invoke(core.clj:3007)
at clojure.core$doall.invoke(core.clj:3023)
at user$eval4018.invoke(form-init3642888309490821030.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6792)
at clojure.lang.Compiler.eval(Compiler.java:6782)
at clojure.lang.Compiler.load(Compiler.java:7237)
... 11 more

子进程失败
`

7 个答案

0

用户 dnolen 发表评论

这个问题有很大可能被关闭。请提供不涉及 ClojureScript 编译器之外的其他内容的最小化步骤来复现问题。我们没有时间去处理 cljsbuild 或其他下游工具引入的间接问题。谢谢。

0

用户 tillda 发表评论

大卫·诺兰,我根据快速入门文档创建了一个失败的简单测试例。以下是链接:https://github.com/tillda/cljs-testcase/

0

用户 dnolen 发表评论

米哈伊,这个失败的例子是不正确的。你没有提供任何 {{:libs}} 选项。

0

用户 tillda 发表评论

啊!非常感谢!因此这个问题是由于我的错误。现在似乎在我的“大型”示例中也正常工作了。

然而,如果能有一个有意义的错误信息,说明文件路径无法解析,那就更好了。如果一个人不是 cljs 编译器专家,这几乎是无法找出来的。毕竟,CLJS-1196 问题和这个错误报告中的错误信息是相同的。

你可以关闭这个问题。

0

用户 dnolen 发表评论

我们将保持此问题开放,以改进错误信息。

0

评论由:bensu 提供

在 {{cljs.closure/source-on-disk}} 中添加了检查,其中包含有关错误信息的信息。

对于提供的案例,错误信息是

java.lang.IllegalArgumentException: 文件 file:/home/carlos/Playground/cljs-testcase/src/hello_world/closure.js 缺少关联的源文件。如果它是一个 JavaScript 库,请将其添加到 :libs

如有需要不同措辞或检查位置,我将提交一个带有修正的新补丁。

备注
已更改:{{(:provides js)}} 为 {{(-provides js)}},以便与 {{IJavaScript}} 保持一致性。
{{cljs.clojure/source-on-disk}} 接收一个 {{js}} 参数,该参数应该符合 {{IJavaScript}} 和 {{ISourceMap}},如果启用了 {{:source-map}},但实现是硬编码到映射中,因为使用了 {{:source-map}} 和 {{:source-url}} 而非 {{ISourceMap}} 方法 {{-source-map}} 和 {{-source-url}}。我建议将 {{PersistentMap}} 和 {{PersistentArrayMap}} 扩展为 {{ISourceMap}},以便让 {{source-on-disk}} 符合这两个协议。

0
参考: https://clojure.atlassian.net/browse/CLJS-1278 (由 alex+import 报告)
...