首页 > 解决方案 > 为依赖于项目级别设置的所有项目定义任务

问题描述

我有一个包含许多子项目的大型 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打印出来。

实现我的目标的预期方法是什么?

标签: sbt

解决方案


您可以创建一个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"printfoo来测试它bar


推荐阅读