2015-05-13 58 views
1

我寫了SBT任務,它可以輸出的依賴關係的信息,按項目進行分組(比如一個SBT項目具有多項目)如何在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 
    ) 

} 
+1

你能分享更多的代碼嗎? –

+0

@DaleWijnand問題更新 – Freewind

+0

'.value'是編譯時宏 - 因此您應該直接引用所有項目(在編譯時應該知道'prj'),就像'(update in prj1).value ++(update在prj2).value ++ ...'而不是'prj'。不過,可能有更好的選擇,所以我的回答並不完整 – dk14

回答

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) => 
     ... 
    } 
    } 
} 
相關問題