構建系統支持通過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 綁定模塊一樣,全套庫屬性也可用於控制庫編譯,儘管很少需要定義或更改這些屬性。