我有一个小的Scala库,我想在Scala.js应用程序中使用它:https://github.com/fbaierl/scala-tarjan
基于这个原因,我决定创建一个可同时编译为Scala.js和Scala JVM的交叉编译库:https://github.com/fbaierl/scalajs-cross-compile-tarjan。但是我对如何从这里继续感到有些困惑。
到目前为止,我在共享目录中拥有所有相关代码:
和两个Tarjan.scala
类,分别用于JVM和JS部分:
这些应该是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)
}
这通常是正确的方法吗?我可以像这样编译项目并发布到声纳类型?
答案 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”。