2013-06-11 80 views
14

后我能够自动执行任务与编译前:SBT应用任务编译

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>提示符键入“foo”,即在编译之后执行任务,但目标是将其自身挂接到编译任务,因此无论何时编译发生,编译完成后都会自动调用foo任务。

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

+0

你能解释一下用例吗? –

+0

@MarkHarrah,Play有一个限制,只能在运行时生成子项目的JavaScript反向路由。我需要在编译时生成一个静态文件的路由,我已经完成了这个工作,除了将任务挂钩为后编译操作(即我需要先编译应用程序,否则不会考虑新路由在路线生成任务)。 – virtualeyes

+0

正在生成的这些文件是否考虑了资源? –

回答

13

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

如果compile被用来表示“编译和咕噜设置的东西了”,然后创建一个prepareGrunt任务取决于compilemyTask和运行来代替。

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

“编译后运行”的危险在于myTask不会在实际需要它的任务之前运行。在Initialize[Task[T]]上有triggeredBy方法,但它很容易被滥用,只有在任务的输出已知仅在所有任务执行后才使用时才应使用。

+3

+1谢谢Mark,你在SBT上做了令人难以置信的工作,保持它(不要忘记睡觉;-)) – virtualeyes