SBT插件如何使源生成器依赖于项目的源?

时间:2015-11-28 20:45:59

标签: scala sbt sbt-plugin

我试图在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时,它会创建文件但不会编译它。

更重要的是,当我只运行sbt compile run时,它仅编译第一个(compile)任务上的项目并生成我的源,然后在run部分编译生成的来源 - 所以,就说话而言,它确实有效,但它需要两个汇编。

我想询问是否有更简单的方法可以执行此操作,如果没有,如何使其仅在一个编译中工作。

0 个答案:

没有答案