我正在寻找一种方法,以这种方式在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
?
答案 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文档,只有在需要明确操作构建状态(这很难做到),调用其他现有命令或修改设置(通常不应该这样)时才需要它:
通常,当您需要执行在常规任务中不可能的事情时,您会求助于命令。
如果你仍然需要一个命令,我认为你不能在子项目中覆盖它并像任务一样聚合,但是你可以定义它一次,然后在它调用的项目中调度它。我真的怀疑你想要它。