Il sistema di compilazione supporta la generazione di interfacce protobuf tramite il
rust_protobuf
tipo di modulo.
La generazione di codice protobuf di base viene eseguita con il crate rust-protobuf
.
Per visualizzare la documentazione su questo utilizzo, consulta la pagina del progetto GitHub con gli esempi protobuf corrispondenti.
Sono supportati anche i protobuf di gRPC, la cui generazione è fornita dal crate grpc-rs
.
Per visualizzare la documentazione su questo utilizzo, consulta la documentazione nella pagina del progetto GitHub gRPC corrispondente.
Utilizzo di base della compilazione di rust_protobuf
Di seguito è riportato un esempio di definizione di un modulo protobuf e
dell'utilizzo di questo modulo come crate. Ulteriori dettagli sulle proprietà importanti e sul loro utilizzo sono disponibili nella sezione Definire un rust_protobuf
.
Se devi utilizzare il codice generato da protobuf tramite una macro include!()
, ad esempio per il codice di terze parti, consulta la pagina Generatori di codice sorgente per un esempio. L'esempio utilizza un modulo rust_bindgen
, ma i mezzi di inclusione delle origini sono gli stessi per tutti i generatori di origini.
Definire un modulo Android.bp rust_protobuf
Supponiamo che esista un file proto in src/protos/my.proto
rispetto al file Android.bp. Il modulo viene quindi definito come segue:
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",
}
Una libreria che utilizza questo crate viene definita facendovi riferimento come se fosse qualsiasi altra dipendenza della libreria:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
Struttura del crate dei moduli rust_protobuf
Ogni file protobuf è organizzato come modulo all'interno della cassetta, assumendo il nome del file protobuf. Ciò significa che tutti i nomi di file di base proto devono essere univoci. Ad esempio, prendi un rust_protobuf
definito come segue:
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
I diversi proto all'interno di questa cassetta verrebbero acceduti come segue:
// 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
Proprietà rust_protobuf importanti
Le proprietà definite di seguito si aggiungono alle proprietà comuni importanti
che si applicano a tutti i moduli. Questi sono particolarmente importanti per i moduli rust_protobuf
Protobuf di Rust o presentano un comportamento unico specifico per il tipo di modulo.
stem, name, crate_name
rust_protobuf
produce varianti di librerie, pertanto per queste tre proprietà esistono gli stessi requisiti previsti per i moduli rust_library
. Per maggiori dettagli, consulta le proprietà rust_library
.
protos
Questo è un elenco di percorsi relativi ai file protobuf per generare l'interfaccia protobuf. I nomi file di base devono essere univoci in protos
e grpc_protos
.
grpc_protos
grpc_protos
è costituito da un elenco di percorsi relativi ai file protobuf che
definiscono grpcs
per generare l'interfaccia protobuf. I nomi file di base devono essere univoci
in protos
e grpc_protos
.
source_stem
source_stem
è il nome del file di origine generato che può essere incluso.
Questa è una definizione di campo obbligatoria, anche se utilizzi le associazioni come
crate, poiché la proprietà stem
controlla solo il nome file di output per le
varianti della raccolta generate. A differenza di altri generatori di codice sorgente, al nome del file viene preposto il prefisso mod_, in modo che il nome finale del file sia mod_<stem>. In questo modo si evitano collisioni di nomi con le origini generate da ogni proto.
Inoltre, come per il modulo delle associazioni bindgen, è disponibile anche l'intero insieme di proprietà della libreria per controllare la compilazione della libreria, anche se raramente è necessario definirle o modificarle.