sbtは、ソースとリソース生成タスクを追加するための標準的なフックを提供します。
ソース生成タスクは、`sourceManaged` のサブディレクトリにソースを生成し、生成されたファイルのシーケンスを返す必要があります。ソース生成関数のシグネチャ(タスクの基礎となる)は通常次のようになります。
def makeSomeSources(base: File): Seq[File]
タスクを追加するキーは`sourceGenerators`と呼ばれます。実行後の値ではなくタスクを追加したいので、通常の`value`ではなく`taskValue`を使用します。生成されたファイルがメイン(`Compile`)ソースかテスト(`Test`)ソースかによって、`sourceGenerators`はスコープされる必要があります。この基本的な構造は次のようになります。
Compile / sourceGenerators += <task of type Seq[File]>.taskValue
たとえば、メソッド`def makeSomeSources(base: File): Seq[File]`を仮定すると、
Compile / sourceGenerators += Def.task {
makeSomeSources((Compile / sourceManaged).value / "demo")
}.taskValue
具体的な例として、次のソースジェネレーターは、実行されるとコンソールに「Hi」と出力する`Test.scala`アプリケーションオブジェクトを生成します。
Compile / sourceGenerators += Def.task {
val file = (Compile / sourceManaged).value / "demo" / "Test.scala"
IO.write(file, """object Test extends App { println("Hi") }""")
Seq(file)
}.taskValue
`run`を実行すると「Hi」が出力されます。
> run
[info] Running Test
Hi
テストソースにするには、`Compile`を`Test`に変更します。
**注意:** ビルドの効率のために、`sourceGenerators`は、各呼び出し時にソースファイルを再生成することを避けるべきです。代わりに、ファイル追跡システムを使用するか、`sbt.Tracked.{ inputChanged, outputChanged }`などを用いて入力値を手動で追跡することにより、出力をキャッシュする必要があります。
デフォルトでは、生成されたソースはパッケージ化されたソースアーティファクトに含まれません。そうするには、他のマッピングと同様にそれらを追加します。パッケージへのファイルの追加を参照してください。ソースジェネレーターは、JavaとScalaの両方のソースを同じシーケンスに混ぜて返すことができます。それらは後で拡張子によって区別されます。
リソース生成タスクは、`resourceManaged`のサブディレクトリにリソースを生成し、生成されたファイルのシーケンスを返す必要があります。ソース生成関数と同様に、リソース生成関数のシグネチャ(タスクの基礎となる)は通常次のようになります。
def makeSomeResources(base: File): Seq[File]
タスクを追加するキーは`resourceGenerators`と呼ばれます。実行後の値ではなくタスクを追加したいので、通常の`value`ではなく`taskValue`を使用します。生成されたファイルがメイン(`Compile`)リソースかテスト(`Test`)リソースかによって、スコープされる必要があります。この基本的な構造は次のようになります。
Compile / resourceGenerators += <task of type Seq[File]>.taskValue
たとえば、メソッド`def makeSomeResources(base: File): Seq[File]`を仮定すると、
Compile / resourceGenerators += Def.task {
makeSomeResources((Compile / resourceManaged).value / "demo")
}.taskValue
`run`(または`package`、`compile`ではない)を実行すると、`resourceManaged`(`target/scala-*/resource_managed`)に`demo`ファイルが追加されます。デフォルトでは、生成されたリソースはパッケージ化されたソースアーティファクトに含まれません。そうするには、他のマッピングと同様にそれらを追加します。パッケージへのファイルの追加を参照してください。
具体的な例として、次の例は、アプリケーション名とバージョンを含む`myapp.properties`プロパティファイルを作成します。
Compile / resourceGenerators += Def.task {
val file = (Compile / resourceManaged).value / "demo" / "myapp.properties"
val contents = "name=%s\nversion=%s".format(name.value,version.value)
IO.write(file, contents)
Seq(file)
}.taskValue
テストリソースにするには、`Compile`を`Test`に変更します。
**注意:** ビルドの効率のために、`resourceGenerators`は各呼び出し時にリソースファイルを再生成することを避けるべきで、代わりに`sbt.Tracked.{ inputChanged, outputChanged }`などを用いて入力値に基づいてキャッシュする必要があります。