我希望向 sbt 添加一个自定义源生成器,并将它与 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
)
Run Code Online (Sandbox Code Playgroud)
错误信息:
[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
Run Code Online (Sandbox Code Playgroud)
要重现此错误,您至少需要在 src/main/protobuf 中有一个 proto 文件。
让我感到困惑的是两个源生成器,我的自定义任务和 scalapb 会发生冲突。他们不应该都写入 src_managed 目录吗?我是否缺少一些基本的 sbt 概念?
有一个已知问题sbt-protoc,它会删除 src 托管目录中的源。
选项 1:使 ScalaPB 生成到 srcManaged 的子目录,以便它只删除该目录:
PB.targets in Compile := Seq(
scalapb.gen() -> (sourceManaged in Compile).value / "protobufs"
)
Run Code Online (Sandbox Code Playgroud)
选项 2:让 ScalaPB 不删除子目录,但您必须不时自己清理它(例如,当 protobuf 消息被重命名时):
PB.deleteTargetDirectory in Compile := false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |