SBT - 根据任务有条件地设置exportJars设置

时间:2017-07-14 11:08:53

标签: sbt scala.js

我有一个混合服务器端Scala / Scala.js项目,构建到一个可运行的jar。我正在使用sbt-revolver插件在更改任何文件时重新启动主类,并且~fastOptJS在更改为客户端文件时重新编译JS。

如果只有客户端文件发生了变化,我不想重新启动主类,因为它会使反馈周期变慢。我使用我定义的一个名为“build”的任务来将jar复制到我想要的位置(对于Docker),如下所示:

exportJars := true
mainClass in appJVM := Some("myproject.Server")

packageOptions in (appJVM, Compile, packageBin) += ManifestAttributes( "Class-Path" -> externalDependencyClasspath.in(appJVM, Runtime).value.files.map { file => s"dependencies/${file.name}" }.mkString(" ") )

lazy val build = taskKey[Unit]("Ensures jars are in the right places for Docker")
build := {

  val packagedDir = new File(target.value, "packaged")
  IO.delete(packagedDir)
  val dependenciesDir = new File(target.value, "packaged/dependencies")
  dependenciesDir.mkdirs()

  val (_, artifactFile) = packagedArtifact.in(appJVM, Compile, packageBin).value
  Files.copy(artifactFile.toPath, new File(packagedDir, artifactFile.getName).toPath, COPY_ATTRIBUTES)

  externalDependencyClasspath.in(appJVM, Runtime, build).value.files.foreach { file =>
    Files.copy(file.toPath, new File(dependenciesDir, file.name).toPath, COPY_ATTRIBUTES)
  }
}

然而,这意味着当我使用appJVM/reStart时,它实际上运行了jar文件,这反过来意味着为了更改客户端JS,必须重建jar文件并且必须重新启动服务器

如果我设置exportJars := false,那么appJVM/reStart从classes目录运行我的项目,因此只运行fastOptJS将让我看到我的更改,而无需重新启动服务器。

是否有办法根据我是否正在运行构建任务来有条件地设置exportJars

2 个答案:

答案 0 :(得分:0)

看起来就像将exportJars设置到我的build任务一样简单:

build := {
  exportJars := true
  ...
}

答案 1 :(得分:0)

我的最终结论是,如果我完全删除了exportJars设置,但是依赖packagedArtifact.in(appJVM, Compile, packageBin)构建了构建,那么我就能充分利用这两个世界。 reStart从classes目录运行,因此可以动态更改资源,但我仍然可以将jar版本复制到正确的位置。

(这仍然会让internalDependencyClasspath返回类dir而不是jar - 除了不使用internalDependencyClasspath解决问题之外我没有解决方法。)