有人知道这是否可行吗?我遇到了以下解决方案:
有一个 shell 脚本可以充当“sbt”,并且可以使用“exec”任务在 gradle 中调用,但它仅限于 Linux 操作系统。我理想地想要一个独立于操作系统的解决方案。
scalajs 有一个 gradle 插件,但它相对较旧(并且似乎不再维护),最高支持版本 0.6,而 scalajs 已经是版本 1.3+。
ScalaJs 有一个“scalajs-compiler”jar,我想知道是否可以使用它来编译 scalajs 项目而不是依赖 SBT,如果有任何文档涵盖此内容,将不胜感激。谢谢大家的帮助。
最佳答案
Scala.js CLI
Scala.js CLI ( GitHub/Download ) 应该适用于 *NIX 系统和 Windows。然而,还有另一个问题:它不会自动使用新版本的 Scala.js。所以目前,它只会为您提供 Scala.js 1.0.0 功能。我们还没有想出如何解决这个问题。
自己编译Scala.js
Scala.js 编译器只是一个 Scala 编译器插件。您只需使用附加参数调用 Scala 编译器即可:
scalac \
-classpath $CLASSPATH:scalajs-library_2.13-1.4.0.jar \
-Xplugin:scalajs-compiler_2.13.4-1.4.0.jar \
$FILES
这将为提供的 .scala
文件生成 .class
和 .sjsir
文件。
scalajs-library/scalajs-compiler 的版本必须与您正在编译的 Scala 版本匹配。此外,请注意编译器版本必须完全匹配,库需要在次要版本中匹配。
自己链接 Scala.js
与 JVM 的 Scala 不同,Scala.js 需要链接步骤。 Scala.js 链接器作为独立库提供。 ( artifacts on maven , Interface API )。
Scala.js CLI 和 sbt 插件都使用此库来链接 Scala.js 代码。然而,CLI 已经过时,并且 sbt 插件也很复杂。因此,我将在这里提供一个示例,而不是链接到示例:
import java.nio.file.Path
import org.scalajs.logging._
import org.scalajs.linker.StandardImpl
import org.scalajs.linker.interface._
import scala.concurrent.ExecutionContext.Implicits.global
def link(classpath: Seq[Path], outputDir: Path): Unit = {
val logger = new ScalaConsoleLogger(Level.Warn)
val linkerConfig = StandardConfig() // look at the API of this, lots of options.
val linker = StandardImpl.linker(linkerConfig)
// Same as scalaJSModuleInitializers in sbt, add if needed.
val moduleInitializers = Seq()
val cache = StandardImpl.irFileCache().newCache
val result = PathIRContainer
.fromClasspath(classpath)
.map(_._1)
.flatMap(cache.cached _)
.flatMap(linker.link(_, moduleInitializers, PathOutputDirectory(outputDir), logger))
Await.result(result, Duration.Inf)
}
这将链接 classpath
中的所有 Scala.js 代码,并将生成的文件放入 outputDirectory
中。
关于gradle - 在Windows机器上使用gradle构建/编译最新的SalaJS(1.3+)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65092014/