Как генерировать источники в sbt-плагине?

Я пытаюсь создать некоторые источники, как описано в Генерация файлов.

Когда я поставлю следующее в моем build.sbt, все работает:

sourceGenerators in Compile += Def.task {
  val file = (sourceManaged in Compile).value / "demo" / "Test.scala"
  IO.write(file, """object Test extends App { println("Hi") }""")
  Seq(file)
}.taskValue

Но когда я пытаюсь сделать то же самое в плагине, задача никогда не запускается:

object MyPlugin extends AutoPlugin {
  override lazy val projectSettings = Seq(
    sourceGenerators in Compile += Def.task {
      val file = (sourceManaged in Compile).value / "demo" / "Test.scala"
      IO.write(file, """object Test extends App { println("Hi") }""")
      Seq(file)
    }.taskValue
  )
}

Все, что я добавил в свой плагин, кажется, работает нормально, но исходный файл никогда не генерируется.

Я пропустил что-то важное?

Ответы

Ответ 1

Вы должны загрузить свой плагин после JvmPlugin, который сбрасывает sourceGenerators в projectSettings (см. sbt.Defaults.sourceConfigPaths).

Вы можете сделать это, добавив его в качестве требований к вашему плагину, например

override def requires = JvmPlugin

Ваш полный пример должен выглядеть следующим образом:

import sbt._
import Keys._
import plugins._

object MyPlugin extends AutoPlugin {
  override def requires = JvmPlugin
  override lazy val projectSettings = Seq(
    sourceGenerators in Compile += Def.task {
      val file = (sourceManaged in Compile).value / "demo" / "Test.scala"
      IO.write(file, """object Test extends App { println("Hi") }""")
      Seq(file)
    }.taskValue
  )
}