プロジェクトのソースに基づいてコードを生成する 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
プロジェクトのみがコンパイルされ、ソースが生成され、次に部分的に生成されたソースがコンパイルされます。コンパイル。compile
run
これを行うためのより簡単な方法があるかどうか、もしそうでない場合は、 1 回のコンパイルだけで機能させる方法があるかどうかを尋ねたいと思います。