我经常想在运行其中一个标准任务之前进行一些自定义.我意识到我可以按照我想要的顺序创建执行现有任务的新任务,但我发现这很麻烦,并且开发人员错过了他应该运行my-compile而不是编译的可能性很大并且导致很难修复错误.
所以我想定义一个自定义任务(比如prepare-app)并将其注入现有任务的依赖树(比如package-bin),这样每当有人调用package-bin时,我的自定义任务就会在它之前运行.
我试过这样做
def mySettings = {
inConfig(Compile)(Seq(prepareAppTask <<= packageBin in Compile map { (pkg: File) =>
// fiddle with the /target folder before package-bin makes it into a jar
})) ++
Seq(name := "my project", version := "1.0")
}
lazy val prepareAppTask = TaskKey[Unit]("prepare-app")
Run Code Online (Sandbox Code Playgroud)
但是在将编译输出打包到jar之前,它不是由package-bin自动执行的.那么如何更改上面的代码才能在合适的时间运行?
更一般地说,我在哪里可以找到有关挂钩到其他任务(如编译)的信息,是否有一般方法可以确保在调用标准任务之前和之后运行自己的任务?
我能够在编译之前自动执行任务:
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任务在编译完成后自动调用.
这是可能的,还是我以错误的方式处理内置编译任务?