sbt - 如何在 sbt 0.13 中动态获取子项目列表
问题描述
如何以编程方式(build.sbt
在 sbt 0.13 中)找到当前根项目的所有子项目?(我还没有尝试过 Project.componentProjects,因为它是 sbt 1.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
解决方案
您可以通过 访问所有子项目的列表buildStructure.value.allProjectRefs
。
另一部分是你的问题是我也经常遇到的一个可怕的问题。我能够通过首先创建 aList[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
}
推荐阅读
- java - Spring MVC,我的 index.jsp 中没有显示数据
- linux - 使用 awk 和 sed 对带有头部和尾部的重复数据块进行排序
- python - 如何在 cuda 环境中的 opencv 中使用过滤器?
- lodash - 如何在 vite 中配置 lodash tree-shaking
- ios - iOS 覆盖安装失败
- intellij-idea - 将intellij项目添加到gitlab时出错
- sql - 如何根据组内日期之间的差异更改列?
- java - 将二维数组打印为字符串问题 - java
- html - 在关闭之外访问 OnItemDataBound 数据
- python - 为不同参数返回相同输出值的函数 - python 3.8