如何以编程方式(在build.sbt中)找到SBT0.13中当前根项目的所有子项目?(我还没有尝试过Project.componentProjects,因为它是SBT1.0中的新特性)。
lazy val root = (project in file(".") ... )
val myTask = taskKey[Unit]("some description")
myTask := {
val masterRoot = baseDirectory.value
// This does not work
// val subProjects: Seq[ProjectReference] = root.aggregate
// So I tried to specify the subproject list explicitly; still does not work
val subProjects = Seq[Project](subPrj1)
subProjects.foreach { subproject =>
// All of this works if the "subproject" is hard-coded to "subPrj1"
val subprojectTarget = target.in(subproject).value / "classes"
val cp = (dependencyClasspath in(subproject, Compile, compile)).value
}
}收到以下错误:
build.sbt: error: Illegal dynamic reference: subproject
val subprojectTarget = target.in(subproject).value / "classes"
^
build.sbt: error: Illegal dynamic reference: subproject
val cp = (dependencyClasspath in(subproject, Compile, compile)).value发布于 2019-01-02 10:53:39
您可以通过buildStructure.value.allProjectRefs访问所有子项目的列表。
你的问题的另一部分是一个令人敬畏的问题,我也经常遇到这个问题。通过首先创建List[Task[A],然后使用递归函数将其提升到Task[List[A]]中,我能够解决此类问题。
def flattenTasks[A](tasks: Seq[Def.Initialize[Task[A]]]): Def.Initialize[Task[List[A]]] =
tasks.toList match {
case Nil => Def.task { Nil }
case x :: xs => Def.taskDyn {
flattenTasks(xs) map (x.value :: _)
}
}
myTask := {
val classDirectories: List[File] = Def.taskDyn {
flattenTasks {
for (project ← buildStructure.value.allProjectRefs)
yield Def.task { (target in project).value / "classes" }
}
}.value
}我使用过这种方法,例如:utility methods actual usage
https://stackoverflow.com/questions/53961938
复制相似问题