System kompilacji obsługuje generowanie interfejsów buforów protokołu za pomocą modułu typu rust_protobuf
.
Podstawowy kod protokołu Protobuf jest generowany z skrzynką rust-protobuf
.
Dokumentację tego wykorzystania znajdziesz na stronie projektu w GitHub wraz z odpowiednimi przykładami protokołu protobuf.
Obsługiwane są też prototypy gRPC, które są generowane przez crate grpc-rs
.
Aby wyświetlić dokumentację dotyczącą tego użycia, zapoznaj się z dokumentacją na odpowiedniej stronie projektu gRPC na GitHubie.
Podstawowe użycie rust_protobuf w procesie kompilacji
Poniżej znajdziesz przykład definiowania modułu protokołu i używania go jako skrzynki. Więcej informacji o ważnych właściwościach i sposobie ich używania znajdziesz w sekcji Definiowanie rust_protobuf
.
Jeśli chcesz użyć kodu wygenerowanego w ramach buforów protokołu za pomocą makra include!()
, np. w przypadku kodu innej firmy, przykład znajdziesz na stronie Generatory źródeł. (Przykład używa modułu rust_bindgen
, ale sposób uwzględniania źródła jest taki sam w przypadku wszystkich generatorów źródeł).
Definiowanie modułu rust_protobuf w Android.bp
Załóżmy, że w domenie src/protos/my.proto
znajduje się jakiś proto w stosunku do pliku Android.bp. Moduł jest następnie zdefiniowany w taki sposób:
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",
}
Biblioteka, która korzysta z tego pakietu, jest definiowana przez odwołanie do niego tak, jakby był to dowolny inny element biblioteki:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
Struktura pliku crate modułów rust_protobuf
Każdy plik protobuf jest uporządkowany jako osobny moduł w kontenerze, który przyjmuje nazwę pliku protobuf. Oznacza to, że wszystkie nazwy plików bazy proto muszą być unikalne. Na przykład:rust_protobuf
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
Do różnych prototypów w tym pliku można uzyskać dostęp w ten sposób:
// 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
Ważniejsze właściwości rust_protobuf
Właściwości zdefiniowane poniżej są uzupełnieniem ważnych wspólnych właściwości, które mają zastosowanie do wszystkich modułów. Są one szczególnie ważne w przypadku modułów protobuf w Rust lub mają unikalne zachowanie specyficzne dla typu modułu rust_protobuf
.
stem, name, crate_name
rust_protobuf
generuje warianty biblioteki, więc te 3 usługi mają te same wymagania co moduły rust_library
. Więcej informacji znajdziesz w opisie właściwości rust_library
.
protos
Lista ścieżek względnych do plików protobuf służących do wygenerowania interfejsu protobuf. Nazwy plików bazowych muszą być unikalne w przypadku protos
i grpc_protos
.
grpc_protos,
Element grpc_protos
zawiera listę ścieżek względnych do plików protokołu, które definiują grpcs
w celu wygenerowania interfejsu protokołu. Nazwy plików bazowych muszą być unikalne w przypadku protos
i grpc_protos
.
łodyga_źródłowa
source_stem
to nazwa wygenerowanego pliku źródłowego, który można uwzględnić.
Jest to wymagana definicja pola, nawet jeśli używasz wiązań jako kreacji, ponieważ właściwość stem
kontroluje tylko nazwę pliku wyjściowego dla wygenerowanych wariantów biblioteki. W odróżnieniu od innych generatorów plików źródłowych nazwa pliku ma prefiks mod_, dzięki czemu ostateczna nazwa pliku to mod_<stem>. Zapobiega to kolizji nazw z wygenerowanymi źródłami z każdego pliku proto.
Dodatkowo, podobnie jak w przypadku modułu bindgen, dostępnych jest też pełne zestawienie właściwości biblioteki, które służą do kontrolowania kompilacji biblioteki, choć rzadko trzeba je definiować lub zmieniać.