我有一个混合服务器端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
?
答案 0 :(得分:0)
看起来就像将exportJars
设置到我的build
任务一样简单:
build := {
exportJars := true
...
}
答案 1 :(得分:0)
我的最终结论是,如果我完全删除了exportJars
设置,但是依赖packagedArtifact.in(appJVM, Compile, packageBin)
构建了构建,那么我就能充分利用这两个世界。 reStart
从classes目录运行,因此可以动态更改资源,但我仍然可以将jar版本复制到正确的位置。
(这仍然会让internalDependencyClasspath
返回类dir而不是jar - 除了不使用internalDependencyClasspath
解决问题之外我没有解决方法。)