Scala 如何在运行时选择要打包的子项目(使用ScopeFilter)?

Scala 如何在运行时选择要打包的子项目(使用ScopeFilter)?,scala,sbt,Scala,Sbt,我正在编写一个任务,将几个但不是所有的子项目打包在一起,并使用排除设置和task.all(scope filter)来选择项目。但是,sbt保持say在运行时引用未定义的设置 下面是我使用的project/build.scala错误,我需要您的建议: import sbt._ import Keys._ object build extends Build { lazy val root = Project( id = "root", base = file("."),

我正在编写一个任务,将几个但不是所有的子项目打包在一起,并使用排除设置和
task.all(scope filter)
来选择项目。但是,sbt保持say
在运行时引用未定义的设置

下面是我使用的project/build.scala错误,我需要您的建议:

import sbt._
import Keys._

object build extends Build {
  lazy val root = Project(
    id = "root",
    base = file("."),
    aggregate = Seq(a,b),
    settings = Seq(
      exclude := Seq(a),
      module := moduleImpl.value,
      modules := modulesImpl.value
    )
  )

  lazy val a = Project(
    id = "a",
    base = file("a")
  )

  lazy val b = Project(
    id = "b",
    base = file("b")
  )

  val exclude = settingKey[Seq[ProjectReference]]("excludes")
  val module = taskKey[String]("module")
  val modules = taskKey[Seq[String]]("modules")

  def moduleImpl = Def.task {
      projectID.value.organization
  }

  def modulesImpl = Def.taskDyn {
    module.all(ScopeFilter(inAggregates(ThisProject) -- inProjects(exclude.value: _*)))
  }
}
这是我真正想要消除的错误:

> show modules
[trace] Stack trace suppressed: run last root/*:modules for the full output.
[error] (root/*:modules) sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
[error] Total time: 0 s, completed 2014-06-12 16:48:05

有没有办法解决这个问题?

sbt会抱怨,因为子项目中没有定义您正在使用的任务

解决方案不是在
module
上调用它,而是在
moduleImpl

lazy val moduleImpl = Def.task {
  projectID.value.organization
}

def modulesImpl = Def.taskDyn {
  moduleImpl.all(ScopeFilter(inAggregates(ThisProject) -- inProjects(exclude.value: _*)))
}
当你这样做的时候

Project(
  id = "root",
  base = file("."),
  aggregate = Seq(a,b),
  settings = Seq(
    exclude := Seq(a),
    module := moduleImpl.value,
    modules := modulesImpl.value
  )
)
您将覆盖所有默认设置。您可能希望使用
默认值添加它们。默认设置
或使用
项目
上的
设置
方法