4

プロジェクトのソースに基づいてコードを生成する SBT プラグインでソース ジェネレーターを作成しようとしています。

私はこのようなことを試しました:

sourceGenerators in Compile += (sources in Compile) map { sources => doSomethingWithSources(sources) }

残念ながら、循環依存が存在するため、SBT はこのプラグインをロードしたくありません。

このため、次のような別のタスクを作成しました。

lazy val myTask = TaskKey[Unit]("myTask", "Do stuff")

このタスクは、実際には sources 値に依存し、ファイルを生成します。

後でprojectSettings値をオーバーライドして、これを追加します。

myTask in Compile := {
  val sourcesValue = (sources in Compile).value
  doSomethingWithSources(sourcesValue)
},
sourcesGenerators in Compile += Def.task(Seq(new File("path/to/myGeneratedSource.scala"))).taskValue

プラグインに次のようなことをさせたいプロジェクトの build.sbt のコンパイル タスクへの依存関係として、このタスクを追加します。

compile in Compile <<= (compile in Compile) dependsOn (myTask in Compile)

動作している間 (ファイルが生成されます)、sbt コマンドを起動すると、ファイルはsbt run作成されますが、コンパイルされません。

さらに、 just を実行すると、最初の ( ) タスクでsbt compile runプロジェクトのみがコンパイルされ、ソースが生成され、次に部分的に生成されたソースがコンパイルされます。コンパイル。compilerun

これを行うためのより簡単な方法があるかどうか、もしそうでない場合は、 1 回のコンパイルだけで機能させる方法があるかどうかを尋ねたいと思います。

4

0 に答える 0