gradle - 在Windows机器上使用gradle构建/编译最新的SalaJS(1.3+)?

标签 gradle scala.js

有人知道这是否可行吗?我遇到了以下解决方案:

  1. 有一个 shell 脚本可以充当“sbt”,并且可以使用“exec”任务在 gradle 中调用,但它仅限于 Linux 操作系统。我理想地想要一个独立于操作系统的解决方案。

  2. 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 mavenInterface 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/

相关文章:

gradle - Gradle/TestNG:使用suiteXmlBuilder()时如何在build.gradle中指定testng包含组?

spring - 在 Gradle 中使用 jettyRunWar 或 jettyRun 与 Spring Boot 应用程序只会在浏览器中列出一个目录

scala - 如何从传递给 scalatags 的事件处理程序访问 'this' 元素?

scala - 如何在 scala.js 中使用 scala.sys.process

scala - 使用服务器端渲染编写 scala-js 前端框架。无法在服务器上使用 scala-js-dom

gradle - 如何使用 Gradle 将编译器参数传递给 Kotlin 编译器

tomcat - 如何使用gradle在远程Tomcat上部署war和client?

android - 程序类型已经存在 : com. google.common.util.concurrent.ListenableFuture

scala.js - 如何在 Scala.js 中创建 webworker 代码

scala - 无法在 PhantomJSEnv 上运行 scala.js,requiresDOM 设置强制为 false