Il sistema di compilazione supporta la generazione di interfacce protobuf tramite il tipo di modulo rust_protobuf
.
La generazione di codice protobuf di base viene eseguita con la 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 gRPC, con la generazione fornita dalla crate grpc-rs
.
Per visualizzare la documentazione su questo utilizzo, consulta la documentazione nella pagina del progetto GitHub gRPC corrispondente.
Utilizzo di base della build rust_protobuf
Di seguito è riportato un esempio di definizione di un modulo protobuf e
del suo utilizzo come crate. Ulteriori dettagli sulle proprietà importanti e sul loro utilizzo sono disponibili nella sezione Definizione di un rust_protobuf
.
Se devi utilizzare il codice generato da protobuf tramite una macro include!()
, ad esempio per codice di terze parti, consulta la pagina Generatori di origine per un esempio. L'esempio utilizza un modulo rust_bindgen
, ma il metodo di inclusione dell'origine è lo stesso per tutti i generatori di origine.
Definisci un modulo Android.bp rust_protobuf
Supponiamo che alcuni proto si trovino in src/protos/my.proto
rispetto al tuo 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 questa crate viene definita facendo riferimento a essa come se fosse qualsiasi altra dipendenza della libreria:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
Struttura delle casse dei moduli rust_protobuf
Ogni file protobuf è organizzato come modulo separato all'interno della crate, prendendo il
nome del file protobuf. Ciò significa che tutti i nomi di base dei file 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",
}
Si accede ai diversi proto all'interno di questo crate nel seguente modo:
// 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 degne di nota
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 protobuf di Rust o mostrano un comportamento unico specifico per il tipo di modulo rust_protobuf
.
stem, name, crate_name
rust_protobuf
genera varianti della libreria, pertanto per queste tre proprietà esistono gli stessi requisiti previsti per i moduli rust_library
. Per i dettagli, consulta le proprietà rust_library
.
protos
Si tratta di un elenco di percorsi relativi ai file protobuf per generare l'interfaccia protobuf. I nomi dei 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 dei file di base devono essere univoci
in protos
e grpc_protos
.
source_stem
source_stem
è il nome del file sorgente generato che può essere incluso.
Si tratta di una definizione di campo obbligatoria, anche se utilizzi i binding come
crate, poiché la proprietà stem
controlla solo il nome file di output per le
varianti della libreria generate. A differenza di altri generatori di origine, il nome file
viene preceduto da mod_, il che rende il nome file finale mod_<stem>. In questo modo si evitano
collisioni di nomi con le origini generate da ogni proto.
Inoltre, come il modulo di binding bindgen, è disponibile anche l'intero set di proprietà della libreria per controllare la compilazione della libreria, anche se raramente è necessario definirle o modificarle.