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