2013-01-16 44 views
7

在sbt中是否有相當於Leiningen的「checkout」功能?設置sbt環境以同時破解多個庫

這是我想要完成的任務:

我有兩個項目,一個應用程序美孚和庫「酒吧」。我想獨立發佈每個這些項目。 取決於酒吧和SBT項目將直接SBT每當有第三方試圖打造「富」(這是典型行爲)從倉庫下載罐子「酒吧」。

現在,說我想在同一時間在兩個酒吧破解。例如,在工作美孚同時,我想直接編輯和調試的一些來源爲酒吧所以編輯會影響(再後來重建酒吧時很方便)。

在這次黑客會話期間,我如何指示sbt從我的機器上的源代碼(而不是我的本地存儲庫)滿足其對酒吧的依賴關係?

(PS我問一個similar question用於Clojure的/ Leiningen。Leiningen有"checkouts"功能,實現這一點。我想知道是否有在SBT類似的東西...)

+0

在一個終端(BAR)'''〜publish-local'''中。在另一個終端(FOO)中'''重新加載; compile'''。完全未經測試。 –

回答

9

你可以聲明從富源的依賴通過一個項目參考:

import sbt._ 

object FooBuild extends Build { 
    lazy val root = Project(
    id = "foo", 
    base = file(".") 
) dependsOn(theBarBuild) 

    lazy val theBarBuild = ProjectRef(
    base = file("/path/to/bar"), 
    id = "bar") 
} 

這應該也重新編譯吧(如果它已經改變),每當你編譯Foo。請注意項目引用的id必須與Bar項目的實際ID匹配,這可能類似於例如如果使用簡單的構建定義(僅限.sbt文件),則爲default-edd2f8

此技術對插件特別有用(請參閱我的blog post關於此主題)。

編輯:

你可以種重新像這樣的代碼結帳行爲:

import sbt._ 

object FooBuild extends Build { 
    lazy val root = addCheckouts(Project(id = "foo", base = file("."))) 

    def addCheckouts(proj: Project): Project = { 
    val checkouts = proj.base.getCanonicalFile/"checkouts" 
    if (! checkouts.exists) proj 
    else proj.dependsOn(IO.listFiles(DirectoryFilter)(checkouts).map { dir => 
     ProjectRef(base = dir, id = dir.name): ClasspathDep[ProjectReference] 
    }:_*) 
    } 
} 

這將檢查項目目錄的checkouts目錄,如果它存在,增加了目錄(應該是其他項目的符號鏈接)作爲項目的項目引用。它期望符號鏈接被命名爲鏈接項目的實際ID(例如default-edd2f8bar)。如果該目錄不存在,那麼構建就像以前一樣工作。

在簽出目錄(或目錄本身)中添加或刪除符號鏈接時,必須重新加載Foo項目以獲取更改。

希望這會有所幫助。

+5

您也可以使用'RootProject(dir)'來選擇根項目而不指定項目ID。 –

+0

謝謝。這很有幫助。我試了一下,它的工作原理。但是,我希望能夠在不改變涉及項目內容的情況下做到這一點。聽起來像一個插件的工作? – kes

+0

另外,根據Mark Harrah的建議,我將'ProjectRef(base = dir,id = dir.name)'改爲'RootProject(dir)'。很棒。 – kes