设置一个scala.js交叉编译的库

时间:2018-11-01 13:06:52

标签: scala cross-platform publish scala.js

我有一个小的Scala库,我想在Scala.js应用程序中使用它:https://github.com/fbaierl/scala-tarjan

基于这个原因,我决定创建一个可同时编译为Scala.js和Scala JVM的交叉编译库:https://github.com/fbaierl/scalajs-cross-compile-tarjan。但是我对如何从这里继续感到有些困惑。

到目前为止,我在共享目录中拥有所有相关代码:

  • shared / src / main / scala

和两个Tarjan.scala类,分别用于JVM和JS部分:

  • js / src / main / scala /
  • jvm / src / main / scala /

这些应该是JVM和JS的公共“接口类”,它们仅从共享库中调用方法。

js / src / main / scala / Tarjan.scala:

import com.github.fbaierl.tarjan.{TarjanRecursive => lib}
import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel}

@JSExportTopLevel("Tarjan")
object Tarjan {
   @JSExport
   def tarjan[T](g: Map[T, List[T]]): Unit = lib.tarjan(g)
}

jvm / src / main / scala / Tarjan.scala:

import com.github.fbaierl.tarjan.{TarjanRecursive => lib}

object Tarjan {
  def tarjan[T](g: Map[T, List[T]]): Unit = lib.tarjan(g)
}

这通常是正确的方法吗?我可以像这样编译项目并发布到声纳类型?

1 个答案:

答案 0 :(得分:2)

您可能希望使用scalajs-stubs库来在共享代码中使用@JSExportTopLevel@JSExport,而不是复制JS和JVM的“接口类”。

shared / src / main / scala / Tarjan.scala:

import com.github.fbaierl.tarjan.{TarjanRecursive => lib}
import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel}

@JSExportTopLevel("Tarjan")
object Tarjan {
  @JSExport
  def tarjan[T](g: Map[T, List[T]]): Unit = lib.tarjan(g)
}

build.sbt:

… .jvmSettings(
  libraryDependencies += "org.scala-js" %% "scalajs-stubs" % scalaJSVersion % "provided"
)

请参阅https://www.scala-js.org/doc/project/cross-build.html底部的“将共享的类导出到JavaScript”。