2017-04-18 65 views
0

我希望添加一个自定义源生成器以将其与scalapb(Scala协议缓冲生成器)一起使用。每个都可以自行工作。但是,如果两者都结合在一起,则该项目在清理后第一次无法编译。如果我再次运行编译,它会成功。scalapb和自定义源生成器冲突

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的至少一个原型文件。

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

回答

2

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