How to get the dependencies of all sub-projects from a SBT project, in a SBT task?

北城以北 提交于 2019-12-06 13:49:11

问题


I'm write a SBT task, which can output the dependencies information, grouped by project (say a SBT project has multi projects)

I know there is a sbt-dependency-graph plugin, but I can use it directly, because I want to generate a json file, but that plugin just output the dependency tree to console, without returning an data object, I can't easily get the data I want.

I found the update task returns a UpdateReport which contains a lot of information I want, but it only belong to the current project. In command line, if I want to know the information of all project, I can manually show all the projects by projects command, and view them one by one by someproject/update.

But how to do the same in a SBT task? I tried:

val reports = projects.toList.map(prj => (update in prj).value)

It reports:

[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

How to fix it?


More code:

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
    )

}

回答1:


After checking the document: http://www.scala-sbt.org/0.13/docs/Tasks.html, I found the solution:

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) =>
      ...
    }
  }
}


来源:https://stackoverflow.com/questions/30210418/how-to-get-the-dependencies-of-all-sub-projects-from-a-sbt-project-in-a-sbt-tas

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!