SBT:访问scala构建中子项目的设置值

dmi*_*try 4 scala sbt

我有一个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)
  ...
}
Run Code Online (Sandbox Code Playgroud)

每个子项目都有自己的build.sbt文件,name := "..."可以在其中指定.

我可以root简单地访问构建中的项目列表SubBuilds.projects并获取Seq[Project].它本来settings: Seq[Def.Setting[_]]就是我希望使用的属性,但我完全不知道如何从这些属性中获取价值.我可以找到一个带键的设置,name但它没有任何相似之处value.

我怎样才能实现这一点:name在scala构建中使用Project实例获取属性?

更新:我应该注意到我打算在其他任务中使用它,我尝试了@ 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
Run Code Online (Sandbox Code Playgroud)

Eug*_*ota 6

请参阅范围。项目是一个键的三个轴之一。您可以name从子项目中获得:

(name in sub_project1).value
Run Code Online (Sandbox Code Playgroud)

  • 当我在任务中执行此操作时,我会收到“非法动态引用”。 (6认同)

lpi*_*ora 6

以尤金的答案为基础.正确的解决方案确实是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")
  }
}
Run Code Online (Sandbox Code Playgroud)