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

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

0
ClojureScript
当尝试使用 `:global-exports` 打包js库时,我遇到了错误


在主线程 "main" 中抛出异常 java.lang.IllegalArgumentException: 不支持类型:clojure.lang.Cons
        在 clojure.lang.RT.contains(RT.java:846)
        在 clojure.core$contains_QMARK_.invokeStatic(core.clj:1484)
        在 clojure.core$contains_QMARK_.invoke(core.clj:1476)
        在 cljs.analyzer$dep_has_global_exports_QMARK_.invokeStatic(analyzer.cljc:782)
...


库仓库: https://github.com/colinkahn/deckgl-cljs

重现方法


clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.339"} org.clojars.protocol55/deckgl {:mvn/version "0.1.1"}}}' -m cljs.main -e "(require 'com.uber.deckgl) (println com.uber.deckgl/DeckGL)"


删除 `:global-exports` 的相同库


clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.339"} org.clojars.protocol55/deckgl {:mvn/version "1.0.0"}}}' -m cljs.main -e "(require 'com.uber.deckgl) (println js/deck.DeckGL)"

5 答案

0

评论者:mfikes

感谢Colin!

请在描述中直接包含任何相关文件吗?

(参见https://script.clojure.org/community/reporting-issues

0

评论者:mfikes

哦,没事。我看出您只需要发出一个 {{clj}} 命令。

0
_评论者:mfikes_

根本原因在于,尽管文件的名称为 {{deps.cljs}},编译器却将其当作 EDN 文件读取。换句话说,符号不应加引号。

JAR 文件中包含的文件如下


{:foreign-libs [{:file "deckgl/deckgl.min.js"
                 :provides ["com.uber.deckgl"]
                 :global-exports '{com.uber.deckgl deck}}]
 :externs ["deckgl/externs/deckgl.js"]}


这导致 {{contains?}} 操作被应用于 {{(quote \{com.uber.deckgl deck\})}},并且产生了所见的堆栈跟踪。

嗨,David,你对这个问题有什么看法?我们是否应该在 clojurescript.org 的文档中处理这个问题,明确指出 {{deps.cljs}} 实际上是用来包含 EDN 的吗?
0

评论者:colinkahn

哎,是的,这确实有点难以理解,尤其是如果您已经知道每种文件类型的规则。我也在使用 cljsjs 作为参考,但现在意识到输出结果必须是 edn: https://github.com/cljsjs/packages/blob/master/react/build.boot#L31

deps.cljs 有点神秘,如果能有一个详尽的解释说明其中有效的选项将会很棒。

支持一个类似 jslibs.edn 的备用名称可能增加一些清晰度。

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