2016-04-24 6 views
3

Я использую ScalaPB для синтеза классов Scala для преобразования моих данных в представление Protobuf и из него. По умолчанию the SBT setup подключается к sbt compile для создания файлов под папкой target.Вручную вызовите компилятор ScalaPB в задаче SBT

Поскольку я ожидаю, что мои файлы .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 

ответ

0
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/") ! 
} 
+0

Я думаю, моя проблема в том, что я не знаю, что путь к 'scalapbc' является – acjay

+0

То есть исполняемый файл устанавливается SBT. Я действительно хотел бы поддерживать рабочий процесс внутри SBT, если это возможно, поэтому никаких зависимостей не нужно устанавливать вручную. – acjay

 Смежные вопросы

  • Нет связанных вопросов^_^