请在2024 Clojure现状调查!中分享您的想法。

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

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


在主线程中抛出异常 java.lang.IllegalArgumentException: 不支持类型clojure.lang.Cons的contains?
      在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\})}},并且出现了相应的堆栈跟踪。

嗨大卫,你对这个问题有什么看法?我们应该在 clojurescript.org 的文档中处理这个问题,澄清 {{deps.cljs}} 实际上是用来包含 EDN 的吗?
0
by

评论者:colinkahn

哎哟,是的,这确实很不符合直观,特别是如果你已经熟悉每种文件类型的规则。我也曾以 cljsjs 作为参考,但现在意识到输出结果必须是 edn: https://github.com/cljsjs/packages/blob/master/react/build.boot#L31

deps.cljs 有点神秘,确实希望能详细解释其中有效的选项。

支持使用 jslibs.edn 这样的备用名称可能会增加一些可读性。

0
by
参考资料: https://clojure.atlassian.net/browse/CLJS-2858(由 colinkahn 提报)
...