2014-07-13 32 views
14

我试图按照Generating files中所述生成一些源。如何在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 
) 
} 

其他一切我放入我的插件似乎工作正常,但源文件永远不会生成。

我错过了一些重要的东西吗?

回答

21

您必须在JvmPlugin之后加载插件,这会重置projectSettings中的sourceGenerators(请参见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 
) 
}