【发布时间】:2015-05-14 10:53:01
【问题描述】:
我在写一个SBT任务,可以输出依赖信息,按项目分组(比如说一个SBT项目有多个项目)
我知道有一个sbt-dependency-graph插件,但是我可以直接使用它,因为我想生成一个json文件,但是那个插件只是将依赖树输出到控制台,没有返回数据对象,我不能轻松获取我想要的数据。
我发现update任务返回了一个UpdateReport,里面有很多我想要的信息,但它只属于当前项目。在命令行中,如果我想知道所有项目的信息,可以通过projects命令手动显示所有项目,通过someproject/update一一查看。
但是如何在 SBT 任务中做同样的事情呢?我试过了:
val reports = projects.toList.map(prj => (update in prj).value)
它报告:
[error] /Users/me/workspace/sbt-test/project/Build.scala:51: Illegal dynamic reference: prj
[error] val reports = projects.toList.map(prj => (update in prj).value)
[error] ^
[error] one error found
如何解决?
更多代码:
import sbt._
import sbt.Keys._
object DemoBuild extends Build {
lazy val allUpdate = taskKey[Unit]("show update reports of all projects")
lazy val core = project
lazy val web = project
lazy val allUpdateDef = allUpdate := {
val reports = projects.toList.map(prj => (update in prj).value)
println(reports)
}
lazy val root = (project in file("."))
.settings(
allUpdateDef
)
}
【问题讨论】:
-
你能分享更多代码吗?
-
@DaleWijnand 问题已更新
-
.value是编译时宏 - 因此您应该直接引用所有项目(prj应该在编译时知道),例如(update in prj1).value ++ (update in prj2).value ++ ...而不仅仅是prj。但是,可能有更好的选择,所以我的回答并不完整 -
我刚刚发现
val filter = ScopeFilter(inAnyProject, inAnyConfiguration); allUpdate := {println(update.all(filter).value)}非常接近我想要的