我有一个SBT(0.13.2)多项目,并且在一个单独的构建文件中声明了一组子项目,如下所示:
object SubBuilds extends Build {
lazy val sub_project1 = Project("sub_project1", file("sub/Project1")).dependsOn(Build.core)
lazy val sub_project2 = Project("sub_project2", file("sub/Project2")).dependsOn(Build.core)
...
}
每个子项目都有自己的build.sbt
文件,其中可以指定name := "..."
。
我可以将root
内的项目列表简单地作为SubBuilds.projects
访问并获取Seq[Project]
。它应该是我希望使用的属性settings: Seq[Def.Setting[_]]
,但我完全坚持如何从任何这些属性中获取价值。我可以找到一个包含密钥name
的设置,但它没有value
。
我如何实现这一点:在scala构建中使用Project实例获取name
属性?
更新: 我应该注意到我打算在其他任务中使用它,我尝试了@ eugene-yokota的答案,但它产生了非法的动态参考"在构建编译期间。
object CustomTasks {
/** Task to display Subprojects */
val subList = taskKey[Unit]("Display subprojects")
val subListTask = subList := {
SubBuilds.projects foreach { a =>
val v = (name in a).value
println(s"Subproject ${a.id}, $v")
}
}
}
[error] .../project/CustomTasks.scala:164: Illegal dynamic reference: a
[error] val v = (name in a).value
答案 0 :(得分:6)
以Eugene的答案为基础。正确的解决方案确实是Scopes,但我猜你错了。
代码应该或多或少像这样
lazy val nameAndProjectID = Def.task {
(name.value, projectID.value)
}
lazy val subListTask = subList := {
nameAndProjectID.all(ScopeFilter()).value.foreach { case (name, id) =>
println(s"Subproject ${id}, $name")
}
}
答案 1 :(得分:4)
见Scopes。项目是一把钥匙的三个轴之一。您可以从子项目中获取name
:
(name in sub_project1).value