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

欢迎!请查看关于页面以获取更多关于如何使用本站的信息。

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


线程 "main" 异常:不支持类型 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 报告)
...