2010-10-19 68 views
3

我試圖讓SBT編譯並生成一些基準簡單的構建工具。我已經告訴它要將測試基準添加到測試路徑中,以便它們與測試一起重新編譯,但我無法弄清楚如何編寫一個動作讓我實際運行它們。是否有可能從Project定義類中調用類,甚至是從命令行調用?使用爲基準

回答

4

是的,它是。

如果你想在SBT運行在同一個虛擬機上運行它們,然後寫類似的項目定義文件如下自定義任務:

lazy val benchmark = task { 
    // code to run benchmarks 
    None // Some("will return an error message") 
    } 

在SBT控制檯中鍵入benchmark會運行上面的任務。實際運行的基準,或者,對於這個問題,你編譯的任何其他類,你可以重用一些SBT的現有基礎設施,即方法runTask,這將創建一個運行東西給你一個任務。它具有以下特徵:

def runTask(mainClass: => Option[String], classpath: PathFinder, options: String*): Task 

只需添加以下到您的文件:您在一個單獨的JVM調用運行它們

lazy val benchmark = task { args => 
    runTask(Some("whatever.your.mainclass.is"), testClasspath, args) 
    } 

當運行基準測試,它有時建議,得到更可靠結果。 SBT允許您通過在字符串命令上調用方法!來運行單獨的進程。假設你有一個要運行的命令java -jar path-to-artifact.jar。然後:

"java -jar path-to-artifact.jar" ! 

在SBT中運行命令。你想把上面的代碼片段放在一個單獨的任務中,和之前一樣。

當你改變你的項目定義不要忘了reload

+1

我會建議在另一個jvm中運行基準測試。當我從sbt調用測試時,它最終會耗盡內存(尤其是在很多測試失敗的情況下)。這是令人討厭的(但不是致命的)測試,但會扭曲基準。 – 2010-10-20 07:02:03

+0

我經常見到這個,在Liftweb裏很多。我對此並不十分確定,但可能因爲以下原因而失敗。每次sbt重新編譯你的文件,你希望從sbt使用它們,sbt會使用自定義類加載器來動態加載類文件。然後這些佔據jvm的permgen空間。一旦你重新編譯,舊的類和新的類都會保留在permgen空間中,如果沒有收集舊的類,遲早你會用完它。增加運行sbt的jvm的permgen空間可能會有所幫助:'-XX:MaxPermSize = 256m'。 – axel22 2010-10-20 07:11:57

2

你不能簡單地寫基準作爲測試,所以當你調用SBT「測試」,他們將運行?您也可以使用「僅測試」運行特定的測試,或者使用'run'或'exec'運行主(有關詳細信息,請參閱http://code.google.com/p/simple-build-tool/wiki/RunningSbt)。

+0

他們可能需要很長的時間,所以我想單獨行動運行它們。 – 2010-10-19 13:01:09

+0

@Dial我看到了,添加了一些替代答案。 – 2010-10-19 15:51:57