如何在sbt插件中生成源代码?

时间:2014-07-13 15:42:11

标签: scala sbt

我正在尝试生成Generating files中描述的一些来源。

当我将以下内容放入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 个答案:

答案 0 :(得分:21)

您必须在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
  )
}