在标准任务之前/之后自动运行自定义任务

Lar*_*ann 33 scala sbt

我经常想在运行其中一个标准任务之前进行一些自定义.我意识到我可以按照我想要的顺序创建执行现有任务的新任务,但我发现这很麻烦,并且开发人员错过了他应该运行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自动执行的.那么如何更改上面的代码才能在合适的时间运行?

更一般地说,我在哪里可以找到有关挂钩到其他任务(如编译)的信息,是否有一般方法可以确保在调用标准任务之前和之后运行自己的任务?

Pau*_*her 33

扩展现有的任务是记录了SBT文档任务(看部分修改现有任务).

像这样的东西:

compile in Compile <<= (compile in Compile) map { _ => 
  // what you want to happen after compile goes here 
}
Run Code Online (Sandbox Code Playgroud)

实际上,还有另一种方法 - 将您的任务定义为依赖于编译

prepareAppTask := (whatever you want to do) dependsOn compile
Run Code Online (Sandbox Code Playgroud)

然后修改packageBin以依赖于:

packageBin <<= packageBin dependsOn prepareAppTask
Run Code Online (Sandbox Code Playgroud)

(以上所有未经测试,但总体推力应该有效,我希望如此).

  • 这对于插入任意操作是正确的.但是,行动通常不是任意的.根据您的要求,您在[不包括jar中的类](http://stackoverflow.com/q/7819066/850196)上的其他问题的答案也可能适用于此处. (3认同)
  • 嗯-自从我写了这个答案以来,SBT似乎有所发展。“ &lt;&lt; =”运算符曾经是您做事情的方式,但是正如您所说的,它不再存在于文档中。恐怕我已经离开Scala了一段时间,而且我不确定如何最好地将这种答案更新为新的事物。 (3认同)

Vla*_*lin 6

作为@Paul Butcher 上一个答案的更新,这在 SBT 1.x 版本中可以以稍微不同的方式完成,因为<<==不再受支持。我在我的一个项目中使用的编译之前运行了一个示例任务示例:

lazy val wsdlImport = TaskKey[Unit]("wsdlImport", "Generates Java classes from WSDL")

wsdlImport := {
  import sys.process._
  "./wsdl/bin/wsdl_import.sh" !
  // or do whatever stuff you need
}

(compile in Compile) := ((compile in Compile) dependsOn wsdlImport).value
Run Code Online (Sandbox Code Playgroud)

这与 1.x 之前的做法非常相似。

此外,官方 SBT 文档还建议了另一种方法,它基本上是任务的组合(而不是依赖关系层次结构)。以与上面相同的例子:

(compile in Compile) := {
  val w = wsdlImport.value
  val c = (compile in Compile).value
  // you can add more tasks to composition or perform some actions with them
  c
}
Run Code Online (Sandbox Code Playgroud)

感觉在某些情况下提供了更多的灵活性,尽管第一个例子看起来更整洁,对我来说。

在 SBT 1.2.3 上测试过,但也应该与其他 1.x 一起使用。