如果您爲此解釋了您的使用場景,這可能會有所幫助,因爲這裏有一些不同的可能解決方案路徑,如果在它們之間進行選擇可能會涉及您尚未告訴我們的考慮因素。
您將無法只將普通方法調用寫入編譯代碼。這是不可能的,因爲在構建定義的時候,sbt還沒有查看你的項目代碼。
警告:漫不經心地想出來。
我可以建議的一個技巧是訪問testLoader in Test
以獲得一個類加載器,在該類加載器中加載已編譯的類,然後使用反射在那裏調用方法。例如,在我自己的構建,我有:
val netlogoVersion = taskKey[String]("...")
netlogoVersion := {
(testLoader in Test).value
.loadClass("org.nlogo.api.Version")
.getMethod("version")
.invoke(null).asInstanceOf[String]
}
我不知道是否訪問testLoader in Test
會在你的情況下,實際的工作,因爲testLoader
負載測試類以及你的普通班,所以你可能會得到一個圓compile in Compile
和compile in Test
之間的依賴關係。
如果你想嘗試製作一個只有正常類加載的類加載器,那麼,嗯。您可以在執行createTestLoader
時查看sbt源代碼並將其用於獲取靈感,修改傳遞給ClasspathUtilities.makeLoader
的參數。 (您也可以看看Run.run0
類似的代碼。它調用makeLoader
爲run
任務的實現的一部分。)
你可能會考慮不同的路徑是重用run
任務背後的機械運行代碼。您將無法通過這種方式在編譯代碼中調用任意方法,只能使用main
方法,但如果不需要返回值,也許您可以忍受。
fullRunTask
方法存在用於創建整個run
類似的任務。請參閱「除運行之外,如何創建自定義運行任務?」從http://www.scala-sbt.org/0.13.1/docs/faq.html。 fullRunTask
可以很容易地創建一個單獨的任務,它在編譯的代碼中運行某些東西,但是它本身並不會讓您一路解決問題,因爲您需要將該任務附加到現有的compile in Compile
任務中。如果你走這條路,我建議你把最後一條作爲一個單獨的問題。
考慮繞過fullRunTask
並將您自己的電話組裝到Run.run
。他們使用相同的機器。在我自己的身材,我目前使用fullRunTask
,但被SBT加回以前fullRunTask
,這裏是什麼樣子我相當於Run.run
基於代碼:
(..., fullClasspath in Compile, runner, streams, ...) map {
(..., cp, runner, s, ...) =>
Run.run("name.of.my.MainClass",
cp.map(_.data), Seq(), s.log)(runner)
}
赦免SBT 0.12,前期宏觀語法;如果用0.13宏重做,這看起來會更好。
無論如何,希望這個大腦轉儲證明有用。
改變內置任務覆蓋在http://stackoverflow.com/questions/7820939/ –
也,只是注意到這是非常類似於http://stackoverflow.com/questions/17045860/sbt-apply-task -after-compile –
是的,我看到了這些問題,但它們沒有回答我編譯後執行代碼的問題。 –