一日の終わりには、コードを実行して Scala ソース ファイルを生成する必要があります。
ファイルの生成
ご存じのとおり、sbt には と呼ばれるソース ファイルを生成するためのフックがあります。sourceGenerators
これについては、ファイルの生成に記載されています。プラグイン作成者は、デフォルトの実装として Slick コード ジェネレーターを使用しSeq[File]
て生成するタスクを提供する必要があります。(sourceManaged in Compile).value / "garfield"
これを と呼びましょうgenerateModel
。プラグインには次の設定があります。
sourceGenerators in Compile += generateModel.taskValue,
generateModel := defaultGenerateModel.value,
defaultGenerateModel := { ... }
ビルド ユーザーが を rewire したい場合、次のようgenerateModel
にすることができます。
generateModel := {
val file = (sourceManaged in Compile).value / "garfield" / "Foo.scala"
IO.write(file, """case class Foo() {}""")
Seq(file)
}
上記のように、コード生成が sbt プラグイン内に含まれている場合、動的なことを行う必要はありません。play-slick-evolutions-codegen-plugin
slick-codegen に依存するため、これは問題になりません。
ユーザーのコードを動的にロードする
質問はユーザーのコードを動的にロードすることに直接関係しているため、それについてもいくつかのポインターを置きます。
- 1 つの方法は、既存の構成から
sbt.Run
APIを使用することです。これはrun
、カスタマイズされたパラメーターを使用してタスクを呼び出すことと同じです。構成用のコードを生成している場合Compile
、ランナーに依存する構成にランナーを使用することはお勧めできません。
- 別の同様の方法は、
sbt.Fork
APIを使用することです。フォークにより、プラグインの外部でコードを実行できます。
sbt がタスク間の依存関係に基づいて自動的にタスクを並べ替え、複数のタスクを並行して実行することを考えると、コードを動的に実行することは予期しない危険に満ちています。