【问题标题】:How can scala-js integrate with sbt-web?scala-js 如何与 sbt-web 集成?
【发布时间】:2014-10-13 18:33:25
【问题描述】:

我想将scala-jssbt-web 一起使用,以便编译它以生成添加到资产管道(例如gzip、摘要)的javascript 资产。我知道 lihaoyi 的工作台项目,但我认为这不会影响资产管道。这两个项目如何集成为一个 sbt-web 插件?

【问题讨论】:

  • @EECOLOR - 我想我的问题是关于如何进行集成,而不是 Typesafe 和 Scala.js 是否在谈论它。但是,如果您收到回复,请在此处更新。谢谢。
  • 回复是:It seems to have fallen out of their immediate priorities, I'm afraid.
  • 这就是我的想法,否则它已经完成了。我正在寻找的是有关如何在两者之间进行集成的某种提示。根据我在 sbt-web 上观看的一段视频,这相对容易。我不介意做这项工作,我只是找不到任何关于做什么的资源。

标签: scala scala.js sbt-web


【解决方案1】:

Scala-js 从 Scala 文件生成 js 文件。 sbt-web 文档将此称为Source file task

结果如下所示:

val compileWithScalaJs = taskKey[Seq[File]]("Compiles with Scala js")

compileWithScalaJs := {
  // call the correct compilation function / task on the Scala.js project
  // copy the resulting javascript files to webTarget.value / "scalajs-plugin"
  // return a list of those files
}

sourceGenerators in Assets <+= compileWithScalaJs

编辑

创建插件需要更多的工作。 Scala.js 还不是AutoPlugin,所以你可能会遇到一些依赖问题。

第一部分是将 Scala.js 库作为依赖项添加到插件中。您可以使用如下代码来做到这一点:

libraryDependencies += Defaults.sbtPluginExtra(
  "org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % "0.5.5", 
  (sbtBinaryVersion in update).value, 
  (scalaBinaryVersion in update).value
)

你的插件看起来像这样:

object MyScalaJsPlugin extends AutoPlugin {
  /* 
    Other settings like autoImport and requires (for the sbt web dependency), 
    see the link above for more information
  */

  def projectSettings = scalaJSSettings ++ Seq(
    // here you add the sourceGenerators in Assets implementation
    // these settings are scoped to the project, which allows you access 
    // to directories in the project as well
  )
}

然后在使用这个插件的项目中你可以这样做:

lazy val root = project.in( file(".") ).enablePlugins(MyScalaJsPlugin)

【讨论】:

  • 这部分相对简单,我可以轻松地将这样的“源文件任务”添加到给定项目中。这与创建一个为您完成所有这些工作的 sbt-web 插件不同。此处或文档中没有说明如何集成各种编译器选项并将其转换为可以自动合并的 sbt-web 插件,包括在加载“SbtWeb”插件时使用默认选项。
  • 啊,我没有从你的问题中明白这一点。我已经添加了我对 sbt 插件的了解以及答案所需的内容。
  • 好点。我更新了问题以表明我正在寻找一个 sbt-web 插件作为解决方案。
  • 感谢您提供有关“AutoPlugin”的其他信息——我猜这是缺少的链接。我现在可能有足够的信息继续进行。
  • 请注意,Scala.js 将在 0.6.0 中成为 AutoPlugin。见github.com/scala-js/scala-js/issues/1025
【解决方案2】:

看看sbt-play-scalajs。它是一个额外的 sbt 插件,有助于与 Play / sbt-web 集成。

您的构建文件将如下所示(从 README 复制):

import sbt.Project.projectToRef

lazy val jsProjects = Seq(js)

lazy val jvm = project.settings(
  scalaJSProjects := jsProjects,
  pipelineStages := Seq(scalaJSProd)).
  enablePlugins(PlayScala).
  aggregate(jsProjects.map(projectToRef): _*)

lazy val js = project.enablePlugins(ScalaJSPlugin, ScalaJSPlay)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2021-08-13
    • 1970-01-01
    • 2023-04-02
    • 2021-02-05
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多