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

欢迎!请查看关于页面以了解更多该如何使用此功能。

0
ClojureScript
在尝试使用 `:global-exports` 包装一个javascript库时,我遇到了错误


Exception in thread "main" java.lang.IllegalArgumentException: contains? not supported on type: clojure.lang.Cons
        at clojure.lang.RT.contains(RT.java:846)
        at clojure.core$contains_QMARK_.invokeStatic(core.clj:1484)
        at clojure.core$contains_QMARK_.invoke(core.clj:1476)
        at 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

评论者: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报告)
...