2017-04-18 10 views
0

カスタムソースジェネレータをsbtに追加し、Scalaプロトコルバッファジェネレータscalapbとともに使用したいと思います。それぞれは単独で動作します。しかし、両方を組み合わせると、プロジェクトはクリーンな状態で初めてコンパイルされません。私がもう一度コンパイルを実行すると、成功します。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 /メイン/いるProtobufに少なくとも1つのプロトファイルが必要になります。

私は、2つのソースジェネレータ、私のカスタムタスク、scalapbが矛盾すると私は困惑します。両方ともsrc_managedディレクトリに書き込むべきではありませんか?私はいくつかの基本的なsbtの概念を欠いていますか?

答えて

2

sbt-protocには、src管理対象ディレクトリ内のソースを削除する既知の問題があります。

オプション1:それだけでそのディレクトリを削除しますのでScalaPBがsrcManagedのサブディレクトリに生成してください:

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

オプション2:ScalaPBはサブディレクトリを削除しないでください、しかし、あなたは時間からそれを自分をきれいにする必要があります(たとえば、プロトタイプメッセージの名前が変更されたとき):

PB.deleteTargetDirectory in Compile := false 
関連する問題