2013-02-01 13 views
5

デフォルトでは、SBTはそれぞれsrc/mainおよびsrc/teststarget/scala-[version]/classesおよびtarget/scala-[version]/test-classesのソースをコンパイルします。 src/core/javaまたはsrc/core/scalaに入れて別のクラスパスにコンパイルしたコアというグループを定義したいと思います。これはどうすればいいですか?SBTで別のコンパイルスコープを定義する方法は?

私の動機:実行中のアプリケーションのJVMプロセスを再起動せずに、開発中に新しいアプリケーションコードを再コンパイルして再ロードしたいので、クラスファイルのグループを別にしたい。したがって、アプリケーションが起動するとコアクラスがロードされ、カスタムクラスローダを使用してsrc/mainからすべてのものをロードします。後者のクラスはリロード可能です。私はこれを行う必要があります。なぜなら、私は、JNIを介してソフトウェアをロードする音楽プログラムを作成しているので、ロードに時間がかかります。開発中にアプリケーションをリブートすると時間が浪費されます。

私は主にクラスファイルを分離する必要があります。私がjarファイルを作っていたら、myapp-core.jarとmyapp-main.jarが欲しいですが、それは重要ではありません。これは最終製品よりも開発のためです。

最初の試み:

val Core = config("core") 
... 
classDirectory in Core <<= crossTarget(t => file(t.getAbsolutePath + "core-classes")) 

は、このエラーを与える:

Reference to undefined setting: 
{.}/*:cross-target from {.}/core:class-directory 
    Did you mean *:cross-target ? 

私は今のスコープについて読ん行くよ...

答えて

5

SBTドキュメントのadvanced configurations exampleことがありますカスタムコンパイル設定の多くの側面を示しています。

基本的な例である:

object MyBuild extends Build { 

    lazy val root = Project(..., 
    settings = Defaults.defaultSettings ++ coreSettings 
) 

    // Declare the custom configuration. 
    lazy val Core = config("core") 

    lazy val coreSettings: Seq[Setting[_]] = 
    // Add the src/core/scala/ compilation configuration. 
    // This configures sources, classpaths, output directories, REPL, scalac, ... 
    inConfig(Core)(Defaults.configSettings) ++ Seq(
     // example dependency just for Core 
     libraryDependencies += "org.example" % "demo" % "1.0" % Core, 
     // register the custom core configuration 
     ivyConfigurations += Core 
    ) 
} 

アクセスfullClasspath in Coreタスクを介してコンパイルされたコアクラスパス。

+0

例が必要以上に理解できない場合は、具体的に追加設定を行いたいことはありますか?それを公開し、それをメインジャーに含める...? –

+0

私はその例をまだ理解していません。私は追加の設定で何をしたいのかを説明するために質問に追加しました。 –

+0

これはうまくいきますが、どのようにしてコア構成をテスト構成で使用できるようにしますか? – Brendanator