加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:20:36 所属栏目:安全 来源:网络整理
导读:我有一个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_
我有一个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:=“…”.

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

我怎样才能实现这一点:在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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读