为所有项目定义任务,具体取决于项目级别的设置

时间:2019-02-04 17:27:30

标签: sbt

我有一个大型SBT项目,其中包含许多子项目。我想添加一个可以在任何依赖项目级别设置(例如name)的项目中运行的任务。

在以下示例中,我定义了一个任务myTask,该任务仅显示项目的名称:

name := "test-project"

val myTask = taskKey[Unit]("")

ThisBuild / myTask := {
  println((ThisProject / name).value)
}

val foo = project

val bar = project

我的意图是能够运行sbt foo/myTasksbt bar/myTask并执行相同的任务,但要考虑到相应项目的设置。但是,如果使用上面的项目定义来执行此操作,则会分别打印test-project

达到目标的预期方式是什么?

1 个答案:

答案 0 :(得分:0)

您可以创建一个AutoPlugin文件夹中的project

import sbt._
import sbt.Keys._

object TestPlugin extends AutoPlugin {

  object autoImport {
    val myTask = taskKey[Unit]("Prints project name")
  }

  import autoImport._

  override def trigger = allRequirements

  override def projectSettings: Seq[Def.Setting[_]] = {
    Seq(myTask := { println(name.value) })
  }
}

由于allRequirements并且没有依赖性,它将自动启用,因此myTask将附加到build.sbt中定义的所有子项目中

val foo = project

val bar = project

您可以使用分别打印sbt "foo/myTask"sbt "bar/myTask"的命令foobar进行测试。