Sbt 如何定义仅为根项目调用的任务?

Sbt 如何定义仅为根项目调用的任务?,sbt,Sbt,当我定义一个任务时,会为多项目生成中的每个项目调用该任务: import sbt._ import Keys._ import IO._ object EnsimePlugin extends Plugin { val ensime = TaskKey[Unit]( "generateEnsime", "Generate the ENSIME configuration for this project") override val projectSettings

当我定义一个任务时,会为多项目生成中的每个项目调用该任务:

import sbt._
import Keys._
import IO._

object EnsimePlugin extends Plugin {

  val ensime = TaskKey[Unit](
    "generateEnsime",
    "Generate the ENSIME configuration for this project")

  override val projectSettings = Seq(
    ensime := generateEnsime (
      (thisProject in Test).value,
      (update in Test).value
    )
  )

  private def generateEnsime(proj: ResolvedProject, update: UpdateReport): Unit = {
    println(s"called by ${proj.id}")
  }    
}
我如何定义一个任务,以便只为根项目调用它


通常不鼓励使用这些命令,但这可能是对
命令的有效使用吗?e、 g.喜欢插件。

来自官方文档关于:

在进行聚合的项目中,本例中的根项目, 您可以控制每个任务的聚合

它将值为
false
的任务的
aggregate
键范围描述为:

aggregate in update := false

使用命令进行会话处理,否则将需要在任务中执行其他步骤。这并不一定意味着在任务中更难,但我对命令与任务的理解是,前者更适合于会话操作。我可能错了,不过在您的特殊情况下,根本不需要命令。

很酷,谢谢。我想我会继续将其编码为一个命令,因为我们可能希望添加命令行参数,而且
sbt
的抽象API不可能意味着在这种情况下访问
状态是一件有用的事情。我怀疑命令行参数是否会阻止任务完成工作。我的理解告诉我,您可以以与命令类似的方式执行任务——我甚至认为从最终用户的角度来看,这并没有什么不同。我可能弄错了…顺便说一句,你能拿出你的解决方案来完成我的回答吗?我不知道你在问什么。我使用的是
命令
,这就避免了进行任何聚合的需要。您是否暗示使用命令意味着默认情况下不进行聚合?