4

我正在尝试在 SBT 插件中创建一个源代码生成器,该插件会根据项目的源代码生成代码。

我试过这样的事情:

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

不幸的是,由于存在循环依赖,SBT 不想加载这个插件。

由于这个事实,我创建了另一个这样的任务:

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

此任务实际上取决于源值并生成文件。

后来我覆盖了这个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部分编译生成的源代码 - 所以,就目前而言,它确实可以工作,但它需要两个汇编。

我想问一下是否有更简单的方法可以做到这一点,如果没有,如何让它只在一个编译中工作。

4

0 回答 0