2014-01-22 47 views
5

默認情況下,我的SBT構建的運行任務執行我的主類(在src/main/scala/中自動找到)。自定義'運行'像項目的任務

如何爲項目添加新任務,該項目的行爲與運行任務類似,但在src/util/scala中找到主類?該任務應該在類路徑上使用src/main/scala運行util main方法。

我正在使用完整的多項目配置的SBT 0.12.4。

回答

1

下面定義了一個新的配置,從src/util/scala編譯來源和定義util:runutil:run-main從新配置中運行主類。編譯和運行時,類路徑中提供了src/main/scala的編譯源代碼。

import sbt._ 
import Keys._ 

object MyBuild extends Build 
{ 
    // Define a new configuration named `util`. 
    // Extending `Compile` means the main classpath is available to `util` 
    lazy val Util = config("util").extend(Compile) 

    // Add the new configuration to the project. 
    // Add the new settings. 
    lazy val root = Project("root", file(".")).configs(Util).settings(utilSettings : _*) 

    // Add the basic source, compilation, and packaging settings 
    // as well as custom run methods. 
    lazy val utilSettings = inConfig(Util)(Defaults.configSettings ++ utilRunSettings) 

    // Settings that define `run` and `run-main` to use the 
    // classpath from the enclosing configuration. 
    // (The standard `run` methods use the `Runtime` configuration. 
    lazy val utilRunSettings = Seq(
     run <<= Defaults.runTask(fullClasspath, mainClass in run, runner in run), 
     runMain <<= Defaults.runMainTask(fullClasspath, runner in run) 
    ) 
} 

(WAS 0.13測試,但應該在0.12工作。)

+0

這看起來不錯。有時間嘗試一下。 – Andy

+0

到目前爲止,我的項目構建文件編譯,但'util:run'自動查找並從'src/main/scala'運行主類。 – Andy

+0

我測試了粘貼的代碼,'util:run'只在'src/util/scala'中運行主類。也許你可以在獨立項目中驗證代碼段,然後發佈如何將它集成到你的構建中? –

1

我不認爲sbt會在src/util /中找到代碼,它應該放在src/main/scala,src/test/scala等中。您可能希望將實用程序類添加到某種「util」包,可能在src/main/com/example/util中,或者將它們放在一個子項目或依賴項目中,但sbt並非真正設計(afaik)能夠處理任意目錄結構。

至於設置多個主要方法,sbt運行,如果它在src/main/scala中找到多個主要方法,將允許您選擇要調用哪一個。

如果是在外部罐子,你可能需要:Configuring sbt project to include external Main methods in "sbt run"

我最常做的是運行sbt console,然後只需要導入並直接從那裏調用的主要方法。例如:

sbt console 
import com.example.Main 
Main(new String[]) 

既然你個子項目,如果你的項目之一是「UTIL」,你應該能夠使用類似sbt util/run運行在UTIL/src目錄/主/ Scala的一個主要方法。

如果您在一個項目中有多個主要方法,您還應該能夠使用sbt "util/run-main com.example.MainClass"

您也可以考慮SBT啓動腳本插件: https://github.com/sbt/sbt-start-script

+0

每http://www.scala-sbt.org/release/docs/Howto/defaultpaths.html,您可以添加任何目錄你想要的任何範圍。我*想*我需要一個新的作用域,在源路徑上使用'main'和'util'目錄,並使用不同名稱的'run'任務。我只是不知道該怎麼做。 – Andy

+0

從你的鏈接看來你可以配置你的項目引用myRandomDirectory/main/scala中的scala來源而不是src/main/scala,但我認爲這對你沒有幫助。有很多方法可以從sbt運行(多個)任務,並且我使用了我的答案中列出的一些機制。我不確定爲什麼將主類保存在util目錄中會有所作爲。 – Brian

+0

我有一個主類以及我的大部分業務邏輯在'src/main/scala'中,並且'src/main/util'中有一些實用程序代碼。實用程序代碼與主代碼非常相關,所以它似乎並不保證它自己的子項目。該實用程序代碼有其自己的主類,不是測試用例代碼,它在通常的'src/test/scala'中掛起。 – Andy

相關問題