2017-04-18 54 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