SBT在编译后应用任务

vir*_*yes 16 scala compilation task sbt

我能够在编译之前自动执行任务:

compile in Compile <<= (compile in Compile).dependsOn(myTask)
Run Code Online (Sandbox Code Playgroud)

如何编译做同样的事情?

我知道我能做到:

compile in Compile <<= (compile in Compile) map{x=>
  // post-compile work
  doFoo()
  x
}
Run Code Online (Sandbox Code Playgroud)

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

做类似的事情:

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

如果我从sbt>提示符输入"foo",则可以正常工作; 即任务在编译后执行,但目标是挂钩到编译任务本身,因此无论何时编译发生,foo任务在编译完成后自动调用.

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

Mar*_*rah 12

通常,有一些任务取决于您的任务.

如果compile被用来表示"编译和咕噜设置的东西了",然后创建一个prepareGrunt依赖于任务compilemyTask,与其和运行.

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

"编译后运行一段时间"的危险是在myTask实际需要它的任务之前不会运行.有triggeredBy方法Initialize[Task[T]],但它很容易被滥用,只有在知道任务的输出仅在所有任务执行后才使用时才应使用.

  • +1感谢Mark,你正在与SBT做出令人难以置信的工作,坚持下去(不要忘记睡觉;-)) (3认同)