scalapb和自定义源生成器冲突

时间:2017-04-18 20:02:13

标签: scala sbt scalapb

我希望为sbt添加一个自定义源生成器,并将其与scalapb(Scala协议缓冲区生成器)一起使用。每个都独立工作。但是当两者合并时,项目在清理后第一次无法编译。如果我再次运行编译,它会成功。

name := "Foo root project"

scalaVersion in ThisBuild:= "2.12.1"

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

PB.targets in Compile := Seq(
  scalapb.gen() -> (sourceManaged in Compile).value
)

错误消息:

[error] source file '/ ... /target/scala-2.12/src_managed/main/demo/Test.scala' could not be found
[error] one error found
[error] (compile:compileIncremental) Compilation failed

要重现此错误,您需要在src / main / protobuf中至少有一个proto文件。

令我困惑的是,两个源生成器,我的自定义任务和scalapb会发生冲突。难道他们只是写入src_managed目录吗?我错过了一些基本的sbt概念吗?

1 个答案:

答案 0 :(得分:3)

sbt-protoc存在一个已知问题,它会删除src托管目录中的源代码。

选项1:将ScalaPB生成到srcManaged的子目录,以便它只删除该目录:

PB.targets in Compile := Seq(
  scalapb.gen() -> (sourceManaged in Compile).value / "protobufs"
)

选项2:让ScalaPB不删除子目录,但您必须不时自行清理它(例如重新命名protobuf消息时):

PB.deleteTargetDirectory in Compile := false