我有很多子项目的大型项目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
无关印刷。
什么是实现我的目标预期的方式吗?
您可以创建一个需要位于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
进行测试。