8

Slickコードジェネレーターを使用してデータベースを指定してScalaモデルを生成するsbtプラグインに取り組んでいます

もちろん、ユーザーにコードジェネレーターをオーバーライドしてもらいたいので、プラグインはこれをサポートする必要があります。

  • とにかく、build.sbt プラグイン キーでパスを指定して Scala クラスを動的にロードできますか? たとえば、ユーザーの親 build.sbt で、彼女は次のようcodegen.override=com.company.project.CustomCodegeneratorなものを提供します。

  • 上記に関連します。カスタム codegen は他のライブラリを使用する可能性があるため、単純な動的クラス ロードでは不十分な場合があります。とにかく、sbt プラグインは、そのプラグインを使用してプロジェクトの依存関係を継承できますか?

これに関する完全な議論は次のとおりです: https://github.com/papauschek/play-slick-evolutions-plugin/issues/1

4

1 に答える 1

3

一日の終わりには、コードを実行して 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-pluginslick-codegen に依存するため、これは問題になりません。

ユーザーのコードを動的にロードする

質問はユーザーのコードを動的にロードすることに直接関係しているため、それについてもいくつかのポインターを置きます。

  • 1 つの方法は、既存の構成からsbt.RunAPIを使用することです。これはrun、カスタマイズされたパラメーターを使用してタスクを呼び出すことと同じです。構成用のコードを生成している場合Compile、ランナーに依存する構成にランナーを使用することはお勧めできません。
  • 別の同様の方法は、sbt.ForkAPIを使用することです。フォークにより、プラグインの外部でコードを実行できます。

sbt がタスク間の依存関係に基づいて自動的にタスクを並べ替え、複数のタスクを並行して実行することを考えると、コードを動的に実行することは予期しない危険に満ちています。

于 2015-01-09T07:44:37.113 に答える