5

デフォルトでは、SBTはソースをそれぞれ下src/mainsrc/teststotarget/scala-[version]/classestarget/scala-[version]/test-classesにコンパイルします。コアと呼ばれる別のグループを定義したいのですが、これを入れsrc/core/javaたりsrc/core/scala、別のクラスパスにコンパイルしたりできます。どうすればよいですか?

私の動機:実行中のアプリケーションの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 ?

スコープについて読みに行きます...

4

1 に答える 1

5

カスタムコンパイル構成の多くの側面を示す高度な構成の例がsbtドキュメントにあります。

基本的な例は次のとおりです。

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ます。

于 2013-02-02T17:30:49.253 に答える