还要注意项目文件

时间:2013-10-23 09:00:09

标签: scala sbt

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

2 个答案:

答案 0 :(得分:6)

正如jsuereth所解释的那样,这不是SBT在一个实例中可以处理的任务。所需要的是重启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"

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

答案 1 :(得分:3)

您实际上无法使用~ <task>并让它立即重建项目本身,因为~ <task>需要读取构建定义本身以确定:

  1. 要观看的源文件
  2. 如何运行任务。
  3. 您正在做的是更改项目/更改的配置。这需要一个完整的reloadreboot sbt来提取新配置。

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

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