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

欢迎!请查看关于页面以获取更多关于这是如何运作的信息。

0
ClojureScript

如果针对JAR中的代码emit分析警告,该警告将包括AOT缓存路径。

例如,使用以下代码:

`
(ns foo.core)

(inc "a")
`

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

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

在这种情况下,可能最好只指示一个相对类路径的文件名

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

如果可能,甚至可以使用如下JAR文件URL

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

要重现此问题,首先使用以下命令创建 {{foo.jar}},其中包含位于 {{foo/core.cljs}} 中的 {{foo.core}} 命名空间

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}} 目录,并使用包含在 {{cljs-1.9.946.jar}} 中的1.9.946 uberjar

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

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

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

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

3 答案

0
评论由:mfikes

附件补丁

# 将几个{{Compilable}}扩展程序(到{{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)
警告: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)"

警告:宏展开已经引用: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
警告:将MapEntry的参数个数错误地传递为3,在第759行 /Users/mfikes/.cljs/.aot_cache/1.10.132/2E9D363/schema/core.cljs


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


警告:宏展开已经引用: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
警告:将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
...