SBT在编译后应用任务

时间:2013-06-11 13:51:44

标签: scala compilation sbt task

我可以在编译之前自动执行任务:

compile in Compile <<= (compile in Compile).dependsOn(myTask)

如何在编译之后执行相同操作

我知道我能做到:

compile in Compile <<= (compile in Compile) map{x=>
  // post-compile work
  doFoo()
  x
}

执行任意Scala代码,但我需要在编译事件发生时自动执行目标任务

做类似的事情:

val foo = TaskKey[Unit]("foo", "...")
val fooTask = foo <<= scalaInstance map {si =>
...
} dependsOn(compile in Compile)

如果我从sbt&gt;键入“foo”,则有效提示;即任务在编译后执行,但目标是挂钩编译任务本身,因此无论何时编译发生,foo任务都会在编译完成后自动调用。

这可能,或者我是否以错误的方式处理内置编译任务?

1 个答案:

答案 0 :(得分:12)

一般来说,有一些任务取决于你的任务。

如果compile用于表示“为Grunt编译和设置”,则创建一个prepareGrunt任务,该任务取决于compilemyTask并运行该任务代替。

如果myTask应该在项目的类和资源被其他东西使用之前运行,那么将它作为exportedProducts的依赖项。像runtest这样的任务以及依赖项目中的任务将从该任务中获取导出的类路径条目。

“编译后运行一段时间”的危险是myTask在实际需要它之前不会运行triggeredByInitialize[Task[T]]上有{{1}}方法,但它很容易被滥用,只有在知道任务的输出仅在所有任务执行后才使用时才能使用。