SBT:自定义命令聚合

时间:2018-04-02 11:49:03

标签: scala sbt multi-project

我正在寻找一种方法,以这种方式在sbt中为多项目结构创建自定义命令:

  • 此命令不应对根项目执行任何操作
  • 此命令应在子项目中执行某些操作
  • 执行根项目的命令应该触发执行子项目的命令

我的build.sbt

中有这个
: any

不幸的是,我在sbt shell中什么都没得到:

lazy val root = (project in file("."))
  .settings(
    name := "Custom command",
    commands += Command.command("customCommand") { state =>
      state
    }
  )
  .aggregate(a, b)

lazy val a = project
  .settings(
    commands += Command.command("customCommand") { state =>
      println("Hello")
      state
    }
  )

lazy val b = project
  .settings(
    commands += Command.command("customCommand") { state =>
      println("Hey there")
      state
    }
  )

预期输出为:

sbt:Custom command> customCommand
sbt:Custom command>

订单并不重要。

所以看起来我的命令只针对sbt:Custom command> customCommand Hello Hey there sbt:Custom command> 项目执行。有没有办法告诉sbt先为子项目执行root

1 个答案:

答案 0 :(得分:0)

大多数情况下,您并不真正需要一个命令,可以通过任务完成您想要的任何操作。您可以定义任务键,在子项目中覆盖它,聚合项目将按预期(聚合)执行:

lazy val customTask = taskKey[Unit]("My custom task")

lazy val root = (project in file("."))
  .aggregate(a, b)

lazy val a = project
  .settings(
    customTask := { println("Hello") }
  )

lazy val b = project
  .settings(
    customTask := { println("Hey there") }
  )

以下是它的工作原理:

> a/customTask
Hello
[success] Total time: 0 s, completed Apr 5, 2018 9:31:43 PM
> b/customTask
Hey there
[success] Total time: 0 s, completed Apr 5, 2018 9:31:47 PM
> customTask
Hey there
Hello
[success] Total time: 0 s, completed Apr 5, 2018 9:31:50 PM

检查Commands上的sbt文档,只有在需要明确操作构建状态(这很难做到),调用其他现有命令或修改设置(通常不应该这样)时才需要它:

  

通常,当您需要执行在常规任务中不可能的事情时,您会求助于命令。

如果你仍然需要一个命令,我认为你不能在子项目中覆盖它并像任务一样聚合,但是你可以定义它一次,然后在它调用的项目中调度它。我真的怀疑你想要它。