【问题标题】:Manually invoke ScalaPB compiler in an SBT task在 SBT 任务中手动调用 ScalaPB 编译器
【发布时间】:2016-08-18 02:00:37
【问题描述】:

我正在使用 ScalaPB 来合成 Scala 类,以便将我的数据与 Protobuf 表示形式相互转换。默认情况下,the SBT setup 挂钩到sbt compile 以生成target 文件夹下的文件。

因为我希望我的.proto 文件很少更改,所以我宁愿在它们更改时手动调用 ScalaPB 进程,并将生成的文件置于版本控制之下。这与我用于Slick's code generation functionality 的方法相同。

我可以这样做:

lazy val genProto = TaskKey[Unit]("gen-proto", "Generate Scala classes from a proto file")
genProto := {
  val protoSources = ...
  val outputDirectory = ...

  // ? run the same process 
}

但我不确定如何使用自定义输入和输出从 SBT 调用流程。

我最近的尝试:

ScalaPbPlugin.runProtoc in ScalaPbPlugin.protobufConfig := (args =>
  com.github.os72.protocjar.Protoc.runProtoc("-v261" +: args.toArray))

lazy val genProto = TaskKey[Unit]("gen-proto", "Generate Scala classes from a proto file")

genProto := {
  val protoSourceDirectory = sourceDirectory.value / "main" / "protobuf"
  val outputDirectory = (scalaSource in Compile).value / outputProtoDirectory
  val schemas = (protoSourceDirectory ** "*.proto").get.map(_.getAbsoluteFile)
  val includeOption = Seq(s"-I$protoSourceDirectory")
  val outputOption = Seq(s"--scala_out=${outputDirectory.absolutePath}")
  val options = schemas.map(_.absolutePath) ++ includeOption ++ outputOption
  (ScalaPbPlugin.runProtoc in ScalaPbPlugin.protobufConfig).value(options)
  (outputDirectory ** "*.scala").get.toSet
}

我收到以下错误:

> genProto
protoc-jar: protoc version: 261, detected platform: mac os x/x86_64
protoc-jar: executing: [/var/folders/lj/_85rbyf5525d3ktt666yjztr0000gn/T/protoc2879794465962204787.exe, /Users/alan/projects/causality/src/main/protobuf/lotEventStoreModel.proto, -I/Users/alan/projects/causality/src/main/protobuf, --scala_out=/Users/alan/projects/causality/src/main/scala/net/artsy/auction/protobuf]
protoc-gen-scala: program not found or is not executable
--scala_out: protoc-gen-scala: Plugin failed with status code 1.
[success] Total time: 0 s, completed Apr 25, 2016 9:39:09 AM

【问题讨论】:

    标签: scala sbt protocol-buffers scalapb


    【解决方案1】:
    import sbt._
    import Keys._
    
    lazy val genProto = TaskKey[Unit]("gen-proto", "Generate Scala classes from a proto file")
    
    genProto := {
        Seq("/path/to/scalapbc-0.5.24/bin/scalapbc",
            "src/main/protobuf/test.proto",
            "--scala_out=src/main/scala/") !
    }
    

    【讨论】:

    • 我认为我的问题是我不知道scalapbc 的路径是什么
    • 即由 SBT 安装的可执行文件。如果可能的话,我真的很想将工作流全部保留在 SBT 中,因此不需要手动安装依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2016-09-16
    • 2018-02-06
    • 2019-04-13
    相关资源
    最近更新 更多