我刚刚成功地将我的第一个 Scala 和 Scala.js 交叉构建库发布到 Sonatype,现在可以在我的应用程序中使用以下两个 Artifact :
- https://search.maven.org/artifact/com.github.fbaierl/scala-tarjan_2.12/0.1.1/jar
- https://search.maven.org/artifact/com.github.fbaierl/scala-tarjan_sjs0.6_2.12/0.1.1/jar
我现在的问题是:为什么 Scala 和 Scala.js 版本包含在 Artifact ID 中?我认为我以前从未见过这样的事情,所以我想知道我是否做错了什么。这是我的 build.sbt
:https://github.com/fbaierl/scalajs-cross-compile-tarjan/blob/03954a3e2d1442ad339298a986209c1403c9692e/build.sbt
最佳答案
这就是 Scala Artifact 的工作方式。几乎所有 Artifact 都看起来像这样 - 只是当您在 sbt 中使用这些 Artifact 时并不明显,因为 (IIRC) _2.12
是由 %%
隐含的sbt 中的 > 运算符。 (_sjs0.6
由 %%%
运算符隐含。)
其根本原因是由不同主要版本的 Scala 编译器(Scala 版本为 epoch.major.minor)编译的 Artifact 不是二进制兼容的(因为否则语言和标准库无法发展)。你不能混合,例如_2.12 和 _2.11 Artifact 位于类路径上,因此必须为两个 Scala 版本单独发布同一库的“相同”版本,因此需要后缀来区分它们。
关于 Artifact ID 中包含 Scala 和 Scala.js 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53142353/