5

sbt以以下方式使用:我~ test:compile在 sbt 中运行,然后在 IDE 中工作,偶尔观察项目是否仍在编译,因为 IDE 的演示文稿编译器往往有问题。当我git pull写一些代码时,文件可能会发生变化project/,所以我想重新加载。有没有办法,如何同时查看源文件和项目文件,所以当项目文件发生变化时,我实际上得到了更新?

4

2 回答 2

7

正如 jsuereth 解释的那样,这不是 SBT 可以在 1 个实例中处理的任务。需要重新启动 SBT 以中止观看过程并重新加载它自己的配置。

下面的 Scala 脚本正是这样做的,它使用 Java NIO WatchService 和 Scala Process 来监视路径并重新启动进程。代码应该相当容易理解:

#!/usr/bin/env scala

import java.nio.file._
import scala.collection.JavaConversions._
import scala.sys.process._

val file = Paths.get(args(0))
val cmd = args(1)
val watcher = FileSystems.getDefault.newWatchService

file.register(
  watcher, 
  StandardWatchEventKinds.ENTRY_CREATE,
  StandardWatchEventKinds.ENTRY_MODIFY,
  StandardWatchEventKinds.ENTRY_DELETE
)

def exec = cmd run true

@scala.annotation.tailrec
def watch(proc: Process): Unit = {
  val key = watcher.take
  val events = key.pollEvents

  val newProc = 
    if (!events.isEmpty) {
      proc.destroy()
      exec
    } else proc

  if (key.reset) watch(newProc)
  else println("aborted")
}

watch(exec)

您的 sbt 目录中的用法是:

watchr.scala project/ "sbt ~ test:compile"

如果有任何不清楚的地方,请不要犹豫,当然可以使用任何脚本语言来实现此行为。

于 2013-10-24T06:23:39.613 回答
3

您实际上现在不能使用~ <task>并让它重新构建项目本身,因为~ <task>需要阅读构建定义本身来确定:

  1. 要观看的源文件
  2. 如何运行任务。

您正在做的是在项目/更改时更改配置。这需要一个完整的reloadreboot一个 sbt 来拉入新的配置。

所以,从 sbt 0.13 开始,这是不可能的。您可以拥有它,以便在project/更改时重建您的源代码,但不重建构建定义,帮助不大。

您可以创建一个新的 sbt 提示符或任务,在运行时可以检查 project/ 中的源文件是否已更新并发出警告/错误,以便您知道重新启动。这可能是目前最好的选择。

于 2013-10-23T14:04:32.647 回答