Le système de compilation prend en charge la génération d'interfaces protobuf via le type de module rust_protobuf
.
La génération de code protobuf de base est effectuée avec la crate rust-protobuf
.
Pour consulter la documentation sur cette utilisation, consultez la page du projet GitHub avec des exemples de tampons de protocole correspondants.
Les protobufs gRPC sont également compatibles, avec une génération fournie par le crate grpc-rs
.
Pour en savoir plus sur cette utilisation, consultez la documentation sur la page du projet GitHub gRPC correspondante.
Utilisation de base de la compilation rust_protobuf
L'exemple suivant montre comment définir un module protobuf et l'utiliser comme crate. Pour en savoir plus sur les propriétés importantes et leur utilisation, consultez la section Définir un rust_protobuf
.
Si vous devez utiliser du code généré par protobuf via une macro include!()
, par exemple pour du code tiers, consultez la page Générateurs de code source pour obtenir un exemple. (L'exemple utilise un module rust_bindgen
, mais le moyen d'inclusion des sources est le même pour tous les générateurs de sources.)
Définir un module Android.bp rust_protobuf
Supposons qu'un fichier proto sur src/protos/my.proto
soit lié à votre fichier Android.bp. Le module est ensuite défini comme suit:
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",
}
Une bibliothèque qui utilise ce crate est définie en le référençant comme s'il s'agissait de n'importe quelle autre dépendance de bibliothèque:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
Structure de crate des modules rust_protobuf
Chaque fichier protobuf est organisé en tant que module distinct dans le crate, et prend le nom du fichier protobuf. Cela signifie que tous les noms de fichiers de base proto doivent être uniques. Prenons l'exemple d'un rust_protobuf
défini comme suit:
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
Les différents protos de cette caisse seraient accessibles comme suit:
// 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
Propriétés rust_protobuf notables
Les propriétés définies ci-dessous s'ajoutent aux propriétés communes importantes qui s'appliquent à tous les modules. Ils sont particulièrement importants pour les modules protobuf Rust ou présentent un comportement unique propre au type de module rust_protobuf
.
stem, name, crate_name
rust_protobuf
produit des variantes de bibliothèque. Les mêmes exigences s'appliquent donc à ces trois propriétés qu'aux modules rust_library
. Pour en savoir plus, consultez les propriétés rust_library
.
protos
Il s'agit d'une liste de chemins d'accès relatifs aux fichiers protobuf permettant de générer l'interface protobuf. Les noms de fichiers de base doivent être uniques pour protos
et grpc_protos
.
grpc_protos
grpc_protos
se compose d'une liste de chemins d'accès relatifs aux fichiers protobuf qui définissent grpcs
pour générer l'interface protobuf. Les noms de fichiers de base doivent être uniques dans protos
et grpc_protos
.
tige_source
source_stem
est le nom du fichier source généré pouvant être inclus.
Il s'agit d'une définition de champ obligatoire, même si vous utilisez les liaisons en tant que crate, car la propriété stem
ne contrôle que le nom de fichier de sortie des variantes de bibliothèque générées. Contrairement aux autres générateurs de sources, le nom de fichier est précédé de mod_, ce qui donne le nom de fichier final mod_<racine>. Cela évite les conflits de noms avec les sources générées à partir de chaque proto.
De plus, comme le module de liaisons "bindinggen", l'ensemble complet des propriétés de la bibliothèque est également disponible pour contrôler la compilation de la bibliothèque, bien qu'il soit rarement nécessaire de définir ou de modifier ces propriétés.