构建系统支持通过rust_protobuf
模块类型生成 protobuf 接口。
使用rust-protobuf
crate 执行基本的 protobuf 代码生成。要查看有关此用法的文档,请参阅带有相应 protobuf示例的GitHub 项目页面。
还支持 gRPC protobufs,生成由grpc-rs
crate 提供。要查看有关此用法的文档,请参阅相应 gRPC GitHub 项目页面上的文档。
基本的 rust_protobuf 构建使用
下面提供了一个定义 protobuf 模块并将该模块用作 crate 的示例。有关重要属性及其使用方式的更多详细信息,请参见定义rust_protobuf
部分。
如果您需要通过include!()
宏使用 protobuf 生成的代码,例如用于第三方代码,请参阅Source Generators页面以获取示例。 (该示例使用rust_bindgen
模块,但源包含的方式对于所有源生成器都是相同的。)
定义一个 rust_protobuf Android.bp 模块
假设src/protos/my.proto
中的一些 proto 相对于您的 Android.bp;然后模块定义如下:
rust_protobuf {
name: "libmy_proto",
// Crate name that's used to generate the rust_library variants.
crate_name: "my_proto",
// Relative paths to the protobuf source files
protos: ["src/protos/my.proto"],
// If protobufs define gRPCs, then they should go in grpc_protos
// instead.
// grpc_protos: ["src/protos/my.proto"],
// 'source_stem' controls the output filename.
// This is the filename that's used in an include! macro.
source_stem: "my_proto_source",
}
使用这个 crate 的库是通过引用它来定义的,就像它是任何其他库依赖项一样:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
rust_protobuf 模块的板条箱结构
每个 protobuf 文件在 crate 中组织为自己的模块,采用 protobuf 文件的名称。这意味着所有 proto 基本文件名都必须是唯一的。例如,取一个rust_protobuf
定义如下:
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
此 crate 中的不同 proto 将按如下方式访问:
// use <crate_name>::<proto_filename>
use foo::a; // protobuf interface defined in a.proto
use foo::b; // protobuf interface defined in b.proto
use foo::c; // protobuf interface defined in c.proto
use foo::c_grpc; // grpc interface defined in c.proto
值得注意的 rust_protobuf 属性
下面定义的属性是对适用于所有模块的重要公共属性的补充。这些要么对 Rust protobuf 模块特别重要,要么表现出特定于rust_protobuf
模块类型的独特行为。
茎,名称,箱子名称
rust_protobuf
生成库变体,因此这三个属性存在与rust_library
模块相同的要求。有关详细信息,请参阅rust_library
属性。
原型
这是用于生成 protobuf 接口的 protobuf 文件的相对路径列表。基本文件名在protos
和grpc_protos
中必须是唯一的。
grpc_protos
grpc_protos
包含 protobuf 文件的相对路径列表,这些文件定义grpcs
以生成 protobuf 接口。基本文件名在protos
和grpc_protos
中必须是唯一的。
源干
source_stem
是可以包含的生成源文件的文件名。这是一个必需的字段定义,即使您将绑定用作 crate,因为stem
属性仅控制生成的库变体的输出文件名。与其他源生成器不同,文件名以 mod_ 为前缀,使最终文件名mod_<stem> 。这可以防止名称与每个 proto 生成的源发生冲突。
此外,与 bindgen 绑定模块一样,全套库属性也可用于控制库编译,尽管很少需要定义或更改这些属性。