2015-08-28 46 views
2

的文件夾,我想在我的SBT,包括建立一個外部項目,如:SBT得到建立RootProject

lazy val leonProject = RootProject(uri("https://github.com/epfl-lara/leon.git")) 

現在我有需要獲取該RootProject的一些文件自定義任務。
如何找到已下載RootProject的路徑?

我已經試過

這並不存在。

leonProject.baseDirectory // Does not exist. There is no such field. 

我試圖尋找SBT的文件,看看有什麼我們可以用RootProject和它的超ProjectReference做,但我無法找到任何東西(我甚至寫了一個腳本來找到他們的網站的相關信息)。

我試圖模仿sbt eclipse plugin的行爲,即跟在thisthis之後。但是它只返回「#footest」並且從不執​​行內部命令,如果我運行sbt footest。它只列出了該命令被激活的項目。

lazy val root = (project in file(".")).settings(
    Keys.commands <+= ("footest")((str: String) => { 
    println("#"+str) 
    lazy val key = Keys.baseDirectory in ThisBuild 
    def structure(state: State): BuildStructure = Project.extract(state).structure 
    Command.single("footest")((state, args) => { 
     println("executed") 
     key.get(structure(state).data) match { 
      case Some(a) => println("The project file "+a) 
      case None => "Undefined setting '%s'!" 
     } 
     state 
     } 
    ) 
    } 
)) 
// and call sbt foobar. 

我的解決方案(感謝@thirstycrow的答案)

在build.sbt文件,在頂層(對我的項目沒有工作的設置),寫上如下:

lazy val leonLocalBase = SettingKey[File]("leonLocalBase", "local base for leon project") 
leonLocalBase := { 
    val build = loadedBuild.value 
    val leonUnit = build.units(leonProject.build) 
    leonUnit.localBase 
} 

// Now you can use leonLocalBase.value.getAbsolutePath() to retrieve the full path where leon has been downloaded. 

回答

1

您可以從加載的項目結構中獲取它。

import sbt._ 
import Keys._ 

object MyBuild extends Build { 

    val leonLocalBase = SettingKey[File]("leonLocalBase", "local base for leon project") 

    lazy val root = Project("root", file(".")) 
    .dependsOn(leonProject) 
    .settings(
     leonLocalBase := { 
     val build = loadedBuild.value 
     val leonUnit = build.units(leonProject.build) 
     leonUnit.localBase 
     } 
    ) 

    lazy val leonProject = RootProject(uri("https://github.com/epfl-lara/leon.git")) 
} 
+0

非常感謝!它對我有效,因爲我必須在外部範圍內定義'leonLocalBase:= {...}',而不是在設置中。比照我的答案 –

相關問題