我正在写一个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
)
}
答案 0 :(得分:0)
检查文档后:http://www.scala-sbt.org/0.13/docs/Tasks.html,我找到了解决方案:
import sbt._
import sbt.Keys._
object DemoBuild extends Build {
lazy val groupByProject: Def.Initialize[Task[(String, UpdateReport)]] =
Def.task {
(thisProject.value.id, (update in thisProject).value)
}
lazy val filter = ScopeFilter(inAnyProject, inAnyConfiguration)
updateByProject := {
val subProjects = groupByProject.all(filter).value.map { case ( projectName, updateReport) =>
...
}
}
}