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

欢迎!请参阅 关于 页面以了解有关如何使用此功能的一些更多信息。

0 投票
ClojureScript

(def a 3)

`
$ clj -Srepro -m cljs.main
java.lang.IllegalArgumentException: /var/folders/gx/nymj3l7x4zq3gxb97v2zwzb40000gn/T/out6255758032123683761473031144485066/cljs/user/userAE725FA.js 不是相对路径

at clojure.java.io$as_relative_path.invokeStatic(io.clj:414)
at clojure.java.io$file.invokeStatic(io.clj:426)
at clojure.java.io$file.invoke(io.clj:418)
at cljs.closure$compile_file.invokeStatic(closure.clj:633)
at cljs.closure$compile_file.invoke(closure.clj:625)
at cljs.closure$fn__5175.invokeStatic(closure.clj:721)
at cljs.closure$fn__5175.invoke(closure.clj:715)
at cljs.closure$fn__5088$G__5081__5095.invoke(closure.clj:543)
at cljs.closure$compile.invokeStatic(closure.clj:595)
at cljs.closure$compile.invoke(closure.clj:592)
at cljs.repl$load_file$fn__6454.invoke(repl.cljc:601)
at cljs.repl$load_file.invokeStatic(repl.cljc:600)
at cljs.repl$load_file.invoke(repl.cljc:592)
at cljs.repl$repl_STAR_$maybe_load_user_file__6612.invoke(repl.cljc:958)
at cljs.repl$repl_STAR_$fn__6621$fn__6622.invoke(repl.cljc:989)
at cljs.repl$repl_STAR_$fn__6621.invoke(repl.cljc:982)
at cljs.compiler$with_core_cljs.invokeStatic(compiler.cljc:1289)
at cljs.compiler$with_core_cljs.invoke(compiler.cljc:1278)
at cljs.repl$repl_STAR_.invokeStatic(repl.cljc:979)
at cljs.repl$repl_STAR_.invoke(repl.cljc:855)
at cljs.cli$repl_opt.invokeStatic(cli.clj:305)
at cljs.cli$repl_opt.invoke(cli.clj:292)
at cljs.cli$main.invokeStatic(cli.clj:638)
at cljs.cli$main.doInvoke(cli.clj:625)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at clojure.lang.AFn.applyToHelper(AFn.java:154)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.core$apply.invokeStatic(core.clj:659)
at clojure.core$apply.invoke(core.clj:652)
at cljs.main$_main.invokeStatic(main.clj:61)
at cljs.main$_main.doInvoke(main.clj:52)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at clojure.lang.Var.applyTo(Var.java:702)
at clojure.core$apply.invokeStatic(core.clj:657)
at clojure.main$main_opt.invokeStatic(main.clj:317)
at clojure.main$main_opt.invoke(main.clj:313)
at clojure.main$main.invokeStatic(main.clj:424)
at clojure.main$main.doInvoke(main.clj:387)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:702)
at clojure.main.main(main.java:37)

ClojureScript 1.10.339
cljs.user=>
`

如果您指定了输出目录(通过 {{-d}})则工作正常。

7 答案

0 投票

评论者:uosl

由于在未指定临时输出目录的情况下运行时,将包含绝对路径的 File 作为输出文件传递给 cljs.closure/compile-file,因此出现了错误。compile-file 仅与相对路径字符串或 File 一起工作,因此我将它修改为也支持绝对路径 File。这样,您可以使用 cljs.closure/src-file->target-file 来使用它。

0 投票

评论者:mfikes

注意:Herald 通过私人 Slack 消息告诉我,CA 已签名。

0 投票
_评论者:mfikes_

如果您使用默认的浏览器 REPL,则这个补丁对票证描述有效,但在 macOS 上如果您指定 Node REPL,则会看到有关临时目录路径规范化的失败相关错误。


执行以下命令:$ clj -Sdeps '{:deps {org.clojure/clojurescript {:local/root "/Users/mfikes/Projects/clojurescript"}}}' -m cljs.main -re node -r
在主线程中抛出异常:java.lang.AssertionError:断言失败:输出文件/private/tmp/cljs-2917/cljs/core.js不在输出目录/var/folders/gx/nymj3l7x4zq3gxb97v2zwzb40000gn/T/out5998260788018592691311499618489419中
(string/starts-with? (util/path output-file) out-dir)
在closure.clj的第636行调用静态内部函数
在closure.clj的第625行调用
在closure.clj的第730行调用
在closure.clj的第543行调用
在closure.clj的第739行调用
在closure.clj的第543行调用
在closure.clj的第595行调用静态内部函数
在closure.clj的第592行调用
在node.clj的第164行调用
在node.clj的第131行调用静态内部函数
在node.clj的第124行调用
在node.clj的第236行
在repl.cljc的第951行调用
在compiler.cljc的第1416行调用静态内部函数
在compiler.cljc的第1405行调用
在repl.cljc的第949行调用静态内部函数
在repl.cljc的第861行调用
在cli.clj的第314行调用静态内部函数
在cli.clj的第301行调用
在cli.clj的第646行调用静态内部函数
在cli.clj的第635行调用
在RestFn.java的第139行调用
在core.clj的第659行调用静态内部函数
在core.clj的第652行调用
在main.clj的第61行调用静态内部函数
在main.clj的第52行调用
在RestFn.java的第137行调用
在Var.java的第702行调用
在core.clj的第657行调用静态内部函数
在main.clj的第317行调用静态内部函数
在main.clj的第313行调用
在main.clj的第424行调用静态内部函数
在main.clj的第387行调用
在RestFn.java的第137行调用
在Var.java的第702行调用
在main.java的第37行调用


我认为可以通过断言来修复这个问题


(same-or-subdirectory-of? out-dir output-file)


而不是


(string/starts-with? (util/path output-file) out-dir)


关于这个补丁,让我担心的是{{{output-file}}}可能是一个_相对_的{{{File}}},在这种情况下


(io/file out-dir output-file)


是一个合法的结构,代码可能需要处理这个分支。在我看来,只有当{{{out-file}}}是_绝对_的(要么是一个字符串,要么是{{{File}}})时,它才应该是“原样”不变,而不是相对于{{{out-dir}}}。换句话说,条件可能不是它满足{{{util/file?}}},而是{{{absolute-path?}}}。

如果我们考虑这两个更改(使用{{{absolute-path?}}}触发逻辑,使用{{{same-or-subdirectory-of?}}}进行断言),这可能覆盖所有情况。(这两个函数都需要在{{{compile-file}}}之后作为{{{declare}}}声明。)
0 投票

评论者:uosl

再次感谢,Mike。我能够在Linux上重现你的错误,对逻辑和断言进行了你建议的更改,并确认已修复。我还将返回在{{{if}}}}条件分支中包围的{{{output-file}}}放在一个{{{io/file}}}调用中,否则如果提供的是绝对路径字符串,我担心它会在更下方的{{{(.exists out-file)}}}表达式中失败。

0 投票

评论者:mfikes

最新的补丁 LGTM,行为正常,并通过 CI 测试。

0 投票

评论者:uosl

在处理 CLJS-2753 补丁的过程中,我发现对该错误的修正也解决了这个问题。如果不希望支持 compile-file 中的绝对路径,则可以取消此补丁并使用 CLJS-2753 补丁。关于 CLJS-2917.patch 中的提交信息关于 {{cljs.repl.rhino...}} 是错误的;这些文件从 opts 中 dissoc :output-dir,因此它们最终向 {{cljs.closure/compile-file}} 传递了相对路径。(这并没有对 {{cljs.repl/load-file}} 做同样的处理,从而导致这两个问题)

0 投票
参考: https://clojure.atlassian.net/browse/CLJS-2917 (由 mfikes 提出)
...