如何在sbt中实现自定义监视任务?

时间:2016-07-18 07:30:44

标签: sbt

我对~ ;task1; task2;不满意所以我想实现我自己的任务,监视更改并执行任务。即我需要一个sbt任务来监视一些文件,并根据更改的内容运行一些任务。

e.g。

val task1: Initialize[Task[Int]] = ....
val task2: Initialize[Task[Int]] = ....

myTask := {
    log.info("Press Enter to stop watching...")
    while(isEnterNotPressedYet) {
        if (someFilesChanged)
            execute(task1) //start task1 and wait for its termination
        else if (someOtherFilesChanged)
            execute(task2)
        Thread.sleep(watchDuration.value)
    }
}

task1.value将不起作用,因为它将在正文之前执行task1并且只执行一次。 dynTask将不起作用,因为我想多次执行任务而不离开循环。确切地说,问题是如何实现以下内容:

def execute[T](task: Initialize[Task[T]]): T
def isEnterNotPressedYet: Boolean

背景:

我有使用JS,Scala,sbt-revolver的Web应用程序。有些资源支持热重载(但仍需要编译!),有些则不支持。即如果* .js文件发生变化,我想调用compileJs任务。如果.scala文件发生变化,我想调用re-start任务。但是sbt watch每个项目只有一组观察资源......

1 个答案:

答案 0 :(得分:2)

不得不深入研究SBT资源并自行实施。 有很多关于奇怪的SBT行为的解决方法,但它有效!

https://github.com/scf37/sbt-overwatch