2024 年 Clojure 调查中分享您的想法!

欢迎!请参阅关于页面以了解有关此内容的更多信息。

0
ClojureScript

如果对 JAR 中的代码发出分析警告,则警告将包括 AOT 缓存路径。

例如,使用以下内容

`
(ns foo.core)

(inc "a")
`

在 {{foo.jar}} 中,加载此代码将导致诊断,消息中包含 AOT 缓存路径

警告:cljs.core/+, 所有参数必须是数字,得到 [string number] 而不是。在第 3 行 /Users/mfikes/.cljs/.aot_cache/1.10.126/47C5358/foo/core.cljs

在这种情况下,可能只表示类路径相对文件名会更好

警告:cljs.core/+, 所有参数必须是数字,得到 [string number] 而不是。在第 3 行 @/foo/core.cljs

或者如果可能,甚至可以使用类似这样的 JAR 文件 URL

警告:cljs.core/+, 所有参数必须是数字,得到 [string number] 而不是。在第 3 行 jar:file:///foo.jar!/foo/core.cljs

为了重现,首先使用以下命令创建 {{foo.jar}},其中包含 {{foo.core}} 命名空间在 {{foo/core.cljs}}

jar cvf foo.jar foo

然后使用 1.10.126 uberjar(在此处重命名为 {{cljs-1.10.126.jar}})启动 Node REPL

java -cp cljs-1.10.126.jar:foo.jar clojure.main -m cljs.repl.node

然后评估

(require 'foo.core)

要查看 1.9.946 的结果,请删除 {{.cljs_node_repl}} 目录,并使用 1.9.946 uberjar(在此处重命名为 {{cljs-1.9.946.jar}})

java -cp cljs-1.9.946.jar:foo.jar clojure.main -m cljs.repl.node

在这种情况下,{{(require 'foo.core)}} 仍然引用本地缓存目录

警告:cljs.core/+, 所有参数必须是数字,得到 [string number] 而不是。在第 3 行 .cljs_node_repl/foo/core.cljs

但相比之下,暴露共享 AOT 缓存路径似乎问题不大。

3 答案

0
_由:mfikes_发表的评论

附带的补丁

修改了一些可编译扩展(包括{{File}}、{{URL}}和{{String}}),以将{{:origin-file}}添加到{{opts}}中(合并{{opts}}的最后,以便保留{{opts}}中已有的任何{{:origin-file}})
添加了一个新的动态变量{{ana/\*origin-file\*}},与{{ana/\*cljs-file\*}}一起使用,并将其绑定到{{(:origin-file opts)}}的值
更新了生成错误信息的代码,使其优先使用{{ana/\*origin-file\*}}而不是{{ana/\*cljs-file\*}}

这的影响是,指向原始错误源而不是缓存中的磁盘副本。

例如,如果分析错误来自JAR文件中的文件,你会看到


cljs.user=> (require 'foo.core)
WARNING: cljs.core/+, 所有参数都必须是数字,但得到的是[string number],在行3,jar:file:/private/tmp/test-origin-file/foo.jar!/foo/core.cljs


另一个示例:使用

{code:title=deps.edn}
{:deps {org.clojure/clojurescript {:mvn/version "1.10.132"}
        com.cerner/clara-rules {:mvn/version "0.17.0"}}}


master产生如下(省略以节省空间)


clj -Srepro -m cljs.main -re node -e "(require 'clara.rules)"

WARNING: macroexpand已经引用: cljs.core/macroexpand正在被: clojure.reflect/macroexpand替换,在行33 /Users/mfikes/.cljs/.aot_cache/1.10.132/3837055/clojure/reflect.cljs
WARNING: 在行239 /Users/mfikes/.cljs/.aot_cache/1.10.132/2E9D363/schema/core.cljs中使用了未声明的Var schema.core/MapEntry
WARNING: 将MapEntry传递了3个参数,行759 /Users/mfikes/.cljs/.aot_cache/1.10.132/2E9D363/schema/core.cljs


而补丁,作为1.10.133构建,产生了更详细的错误指针,指向实际的源JAR,而不是AOT缓存目录


WARNING: macroexpand已经引用: cljs.core/macroexpand正在被clojure.reflect/macroexpand替换,在行33 jar:file:/Users/mfikes/.m2/repository/org/clojure/clojurescript/1.10.133/clojurescript-1.10.133.jar!/clojure/reflect.cljs
WARNING: 在行239 jar:file:/Users/mfikes/.m2/repository/prismatic/schema/1.1.6/schema-1.1.6.jar!/schema/core.clj中使用了未声明的Var schema.core/MapEntry
WARNING: 将MapEntry传递了3个参数,行759 jar:file:/Users/mfikes/.m2/repository/prismatic/schema/1.1.6/schema-1.1.6.jar!/schema/core.cljs
0

评论者:dnolen

是的,这是REPL特有的问题。我认为正确处理方法是修复REPL编译代码的方式。目前它们以相反的顺序进行一次分析传递,而不是按依赖顺序逐个放置并编译。这将是一个清理一些旧代码路径的好机会,这些路径只由REPL使用。

0
...