我有一个混合的服务器端Scala/Scala.js项目,内置到一个可运行的jar。我正在使用sbt-revolver插件重新启动任何文件更改的主类,并且〜fastOptJS重新编译JS更改为客户端文件。SBT - 根据任务条件设置exportJars设置
如果只有客户端文件发生更改,我不想重新启动主类,因为它会使反馈周期变慢。我用我定义称为任务“打造”的罐子周围复制到我希望他们(对码头工人),像这样:
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
,具体取决于我是否正在运行构建任务?
没有,这是一个无操作。设置是不可变的。您只需创建一个表示关联'exportJars:= true'的不变的值'Setting [_]',然后抛弃该值。 我不认为你想要做什么是可能的。你*可以做的是定义一个*命令*,首先设置exportJars:= true然后调用'build'。搜索'addCommandAlias'。 – sjrd
谢谢@sjrd - 看起来像我被误诊了。我试图达到的目标实际上是通过完全除去'''exportJars'''来实现的。然后从''''''''目录运行''''reStart'',但''''build'''任务中对''''''''''''''''''''''''''''进行引用'''''''似乎足以迫使它无论如何创建一个jar文件。 –