我试图在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
部分编译生成的来源 - 所以,就说话而言,它确实有效,但它需要两个汇编。
我想询问是否有更简单的方法可以执行此操作,如果没有,如何使其仅在一个编译中工作。