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发表的评论:

由于在未指定临时输出目录的情况下运行时,cljs.closure/compile-file传递了包含绝对路径的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
cljs.user=> 线程 "main" 中发生异常 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)
在 cljs.closure$compile_file.invokeStatic(closure.clj:636)
在 cljs.closure$compile_file.invoke(closure.clj:625)
在 cljs.closure$eval7272$fn__7273.invoke(closure.clj:730)
在 cljs.closure$eval7175$fn__7176$G__7164__7183.invoke(closure.clj:543)
在 cljs.closure$eval7278$fn__7279.invoke(closure.clj:739)
在 cljs.closure$eval7175$fn__7176$G__7164__7183.invoke(closure.clj:543)
在 cljs.closure$compile.invokeStatic(closure.clj:595)
在 cljs.closure$compile.invoke(closure.clj:592)
在 cljs.repl.node$setup$fn__9880.invoke(node.clj:164)
在 cljs.repl.node$setup.invokeStatic(node.clj:131)
在 cljs.repl.node$setup.invoke(node.clj:124)
在 cljs.repl.node.NodeEnv._setup(node.clj:236)
在 cljs.repl$repl_STAR_$fn__8878.invoke(repl.cljc:951)
在 cljs.compiler$with_core_cljs.invokeStatic(compiler.cljc:1416)
在 cljs.compiler$with_core_cljs.invoke(compiler.cljc:1405)
在 cljs.repl$repl_STAR_.invokeStatic(repl.cljc:949)
在 cljs.repl$repl_STAR_.invoke(repl.cljc:861)
在 cljs.cli$repl_opt.invokeStatic(cli.clj:314)
在 cljs.cli$repl_opt.invoke(cli.clj:301)
在 cljs.cli$main.invokeStatic(cli.clj:646)
在 cljs.cli$main.doInvoke(cli.clj:635)
在 clojure.lang.RestFn.applyTo(RestFn.java:139)
在 clojure.core$apply.invokeStatic(core.clj:659)
在 clojure.core$apply.invoke(core.clj:652)
在 cljs.main$_main.invokeStatic(main.clj:61)
在 cljs.main$_main.doInvoke(main.clj:52)
在 clojure.lang.RestFn.applyTo(RestFn.java:137)
在 clojure.lang.Var.applyTo(Var.java:702)
在 clojure.core$apply.invokeStatic(core.clj:657)
在 clojure.main$main_opt.invokeStatic(main.clj:317)
在 clojure.main$main_opt.invoke(main.clj:313)
在 clojure.main$main.invokeStatic(main.clj:424)
在 clojure.main$main.doInvoke(main.clj:387)
在 clojure.lang.RestFn.applyTo(RestFn.java:137)
在 clojure.lang.Var.applyTo(Var.java:702)
在 clojure.main.main(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?}}进行断言),这可能覆盖所有情况。(这两个函数都需要作为{{declare}} d,因为它们出现在{{compile-file}}之后。)
0
通过

由uosl发表的评论:

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

0

由mfikes发表的评论:

最新补丁LGTM,表现正常,并通过了CI测试。

0

由uosl发表的评论:

在处理CLJS-2753补丁时,我发现对该错误的修复也解决了这个问题。如果不希望在compile-file中支持绝对路径,则可以删除此补丁,改用CLJS-2753补丁。关于CLJS-2917.patch中的commit消息关于{{cljs.repl.rhino...}}是不正确的;这些文件从opts中dissoc :output-dir,所以最终将相对路径传递给{{cljs.closure/compile-file}}。(对于{{cljs.repl/load-file}}并未这样做,因此导致了这两个问题)

0
...