首页 > 解决方案 > 将文件级选项设置为 scalapb 项目

问题描述

我正在使用 ScalaPB(0.11.1 版)和插件 sbt-protoc(1.0.3 版)尝试在 Scala 2.12 中使用 ProtocolBuffers 编译一个旧项目。阅读文档,我想将文件属性设置preserve_unknown_fieldsfalse. 但我的问题是,在哪里?我需要在哪里设置这个标志?在 .proto 文件上?

我还尝试通过在我的另一个 .proto 文件旁边创建一个 package.proto 文件来包含该标志作为包范围选项,该文件具有以下内容(如此处指定

import "scalapb/scalapb.proto";

package eur.astrata.eu.bigdata.tpms.protobuf;

option (scalapb.options) = {
  preserve_unknown_fields: false
};

但是在尝试编译时,出现以下错误:

[libprotobuf WARNING T:\src\github\protobuf\src\google\protobuf\compiler\parser.cc:648] No syntax specified for the proto file: package.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)
scalapb/scalapb.proto: File not found.
package.proto:1:1: Import "scalapb/scalapb.proto" was not found or had errors.

syntax = "proto3";一开始也尝试过,但它不起作用。

任何帮助将不胜感激。

标签: scalaprotocol-buffersscalapb

解决方案


文档

如果你正在使用 sbt-protoc 并导入像 scalapb/scalapb.proto 这样的原型,或者像 google/protobuf/wrappers.proto 这样的常见协议缓冲区:

将以下内容添加到您的 build.sbt:

libraryDependencies += "com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf"

这告诉 sbt-protoc 从这个 jar 中提取 protos(及其所有依赖项,包括 Google 的公共 protos),并使其在传递给 protoc 的包含路径中可用。

重要的是要补充一点,通过设置preserve_unknown_fields为 false,您将关闭一个 protobuf 功能,当分布式系统的不同部分未运行相同版本的模式时,该功能可以防止数据丢失。


推荐阅读