2017-07-14 43 views
0

我有一个混合的服务器端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,具体取决于我是否正在运行构建任务?

回答

0

我最后的结论是,如果我完全删除exportJars设置,但取得的构建依赖于packagedArtifact.in(appJVM, Compile, packageBin)后来我两全其美的。 reStart从classes目录运行,所以资源可以随时更改,但我仍然有一个jar版本可以复制到正确的位置。

(这仍然留下internalDependencyClasspath返回类目录,而不是一个罐子 - 我没有办法到其他比不使用internalDependencyClasspath解决它)

0

看起来像它为移动设置exportJars到我build的任务,因为这样简单:

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

没有,这是一个无操作。设置是不可变的。您只需创建一个表示关联'exportJars:= true'的不变的值'Setting [_]',然后抛弃该值。 我不认为你想要做什么是可能的。你*可以做的是定义一个*命令*,首先设置exportJars:= true然后调用'build'。搜索'addCommandAlias'。 – sjrd

+0

谢谢@sjrd - 看起来像我被误诊了。我试图达到的目标实际上是通过完全除去'''exportJars'''来实现的。然后从''''''''目录运行''''reStart'',但''''build'''任务中对''''''''''''''''''''''''''''进行引用'''''''似乎足以迫使它无论如何创建一个jar文件。 –