设置一个 scala.js 交叉编译库
Setup a scala.js cross compiled library
我有一个小型 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
和 JVM 和 JS 部分的两个 Tarjan.scala
类:
- js/src/main/scala/
- jvm/src/main/scala/
对于仅从共享库调用方法的 JVM 和 JS,这些应该是 public "interface classes"。
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)
}
这通常是正确的方法吗?我可以像那样编译项目并发布到例如声纳型?
不是为 JS 和 JVM 复制 "interface classes",您可能希望使用 scalajs-stubs 库以便能够在共享代码中使用 @JSExportTopLevel
和 @JSExport
。
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 底部的 "Exporting shared classes to JavaScript"。
我有一个小型 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
和 JVM 和 JS 部分的两个 Tarjan.scala
类:
- js/src/main/scala/
- jvm/src/main/scala/
对于仅从共享库调用方法的 JVM 和 JS,这些应该是 public "interface classes"。
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)
}
这通常是正确的方法吗?我可以像那样编译项目并发布到例如声纳型?
不是为 JS 和 JVM 复制 "interface classes",您可能希望使用 scalajs-stubs 库以便能够在共享代码中使用 @JSExportTopLevel
和 @JSExport
。
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 底部的 "Exporting shared classes to JavaScript"。