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

欢迎!有关此如何工作的更多信息,请参阅关于页面。

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


主线程中发生异常 java.lang.IllegalArgumentException: clojure.lang.Cons 类型不支持 contains?
        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报告)
...