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的行爲,即跟在this和this之後。但是它只返回「#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.
非常感謝!它對我有效,因爲我必須在外部範圍內定義'leonLocalBase:= {...}',而不是在設置中。比照我的答案 –