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

欢迎!请参阅关于页面以了解更多关于此页如何工作的小信息。

0
ClojureScript

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

例如,使用

`
(ns foo.core)

(inc "a")
`

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

WARNING: cljs.core/+,所有参数必须是数字,得到[字符串数字]代替。在第3行/Users/mfikes/.cljs/.aot_cache/1.10.126/47C5358/foo/core.cljs

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

WARNING: cljs.core/+,所有参数必须是数字,得到[字符串数字]代替。在第3行@/foo/core.cljs

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

WARNING: cljs.core/+,所有参数必须是数字,得到[字符串数字]代替。在第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)}}仍然引用本地的缓存目录

WARNING: cljs.core/+,所有参数必须是数字,得到[字符串数字]代替。在第3行.cljs_node_repl/foo/core.cljs

但与向用户公开共享AOT缓存路径相比,这似乎不那么有问题。

3 答案

0
评论由:mfikes_ 提供

附带的补丁

# 修改一些 {{Compilable}} 扩展(到 {{File},{{URL},和 {{String}})来向 {{opts}} 添加 {{:origin-file}},并以最后一个合并 {{opts}} 所在的 opt-s,以便保持 {{opts}} 中已存在的 {{:origin-file}})
# 添加一个新 {{ana/\*origin-file\*}} 动态变量与 {{ana/\*cljs-file\*}} 一起使用,并将其绑定到 {{(:origin-file opts)}} 的值
更新渲染错误信息的代码,优先使用 {{ana/\*origin-file\*}} 而不是 {{ana/\*cljs-file\*}}

这样的效果是,指向错误的原生来源,而不是缓存中的磁盘副本(本地或共享)。

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


cljs.user=> (require 'foo.core)
警告:cljs.core/+, 所有参数都必须是数字,得到 [字符串数字] 而非数字。在第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)"

警告: macroexpand 已经引用: cljs.core/macroexpand 正在被 clojure.reflect/macroexpand 替换,在第33行,/Users/mfikes/.cljs/.aot_cache/1.10.132/3837055/clojure/reflect.cljs
警告:在239行 /Users/mfikes/.cljs/.aot_cache/1.10.132/2E9D363/schema/core.cljs 中使用了未声明的 Var schema.core/MapEntry
警告:在759行 /Users/mfikes/.cljs/.aot_cache/1.10.132/2E9D363/schema/core.cljs 中传给 MapEntry 的参数数量不正确(3个)


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


警告: 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
警告:在239行 jar:file:/Users/mfikes/.m2/repository/prismatic/schema/1.1.6/schema-1.1.6.jar!/schema/core.clj 中使用了未声明的 Var schema.core/MapEntry
警告:在759行 jar:file:/Users/mfikes/.m2/repository/prismatic/schema/1.1.6/schema-1.1.6.jar!/schema/core.cljs 中传给 MapEntry 的参数数量不正确(3个)
0

评论者:dnolen

是的,这是一个 REPL 特定的问题。我认为处理这个问题的正确方法是修复 REPL 编译代码的方式。目前,它们以反向顺序执行分析遍历,而不是只按依赖关系顺序放置所有内容并进行编译,就像构建一样。这将是一个清理一些旧代码路径的好机会,这些路径只由 REPL 使用。

0
参考: https://clojure.atlassian.net/browse/CLJS-2615 (由 mfikes 报告)
...