我有一个大型SBT项目,其中包含许多子项目。我想添加一个可以在任何依赖项目级别设置(例如name
)的项目中运行的任务。
在以下示例中,我定义了一个任务myTask
,该任务仅显示项目的名称:
name := "test-project"
val myTask = taskKey[Unit]("")
ThisBuild / myTask := {
println((ThisProject / name).value)
}
val foo = project
val bar = project
我的意图是能够运行sbt foo/myTask
或sbt bar/myTask
并执行相同的任务,但要考虑到相应项目的设置。但是,如果使用上面的项目定义来执行此操作,则会分别打印test-project
。
达到目标的预期方式是什么?
答案 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"
的命令foo
和bar
进行测试。