我以下列方式使用sbt
:我在sbt中运行~ test:compile
然后在IDE中工作,如果项目仍然编译,偶尔会观看,因为IDE的演示编译器往往是错误的。当我git pull
一些代码时,project/
文件可能会有变化,所以我想重新加载。有没有办法,如何观察源文件和项目文件,所以当项目文件发生变化时,我实际上得到了更新?
答案 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>
需要读取构建定义本身以确定:
您正在做的是更改项目/更改的配置。这需要一个完整的reload
或reboot
sbt来提取新配置。
所以,从0.13开始,这是不可能的。 可以拥有它,以便在project/
更改时重建源代码,但不重建构建定义,没有多大帮助。
您可以创建一个新的sbt提示符或任务,在运行时可以检查项目/中的源文件是否更新并发出警告/错误,以便您知道重新启动。这可能是目前最好的选择。