O sistema de build oferece suporte à geração de interfaces protobuf usando o tipo de
módulo rust_protobuf
.
A geração básica do código protobuf é feita com a caixa rust-protobuf
.
Para ver a documentação sobre esse uso, consulte a página do projeto do GitHub
com os exemplos de protobuf correspondentes (links em inglês).
Também há suporte para protobufs gRPC, com a geração fornecida pela caixa grpc-rs
.
Para ver a documentação sobre esse uso, consulte a página do projeto do GitHub (link em inglês) referente ao gRPC.
Uso básico do build rust_protobuf
Veja abaixo um exemplo de como definir um módulo protobuf e
o usar como uma caixa. Você pode ver mais detalhes sobre propriedades importantes e como elas são
usadas na seção
Definir um rust_protobuf
.
Se você precisar usar um código protobuf gerado por uma macro include!()
, como
para códigos de terceiros, consulte a página Geradores de origem
para ver um exemplo. O exemplo usa um módulo rust_bindgen
, mas os meios de inclusão de
origem são iguais para todos os geradores.
Definir um módulo rust_protobuf Android.bp
Vamos supor que algum proto em src/protos/my.proto
esteja relacionado ao Android.bp. O
módulo é definido desta forma:
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",
}
Uma biblioteca que usa essa caixa é definida fazendo referência a ela como se fosse qualquer outra dependência de biblioteca:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
Estrutura da caixa de módulos rust_protobuf
Cada arquivo protobuf é organizado como seu próprio módulo dentro da caixa, usando o
nome do arquivo protobuf. Isso significa que todos os nomes de arquivo base do proto precisam ser exclusivos. Por
exemplo, considere um rust_protobuf
definido desta maneira:
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
Os diferentes protos dentro dessa caixa seriam acessados desta maneira:
// 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
Propriedades rust_protobuf importantes
As propriedades definidas abaixo são adicionadas a propriedades comuns importantes
que se aplicam a todos os módulos. Elas são especialmente importantes para os módulos
Rust protobuf ou apresentam um comportamento único específico para o tipo de
módulo rust_protobuf
.
stem, name, crate_name
Um rust_protobuf
produz variantes de biblioteca. Portanto, os mesmos requisitos que existem para
essas três propriedades são parecidos com os dos módulos de rust_library
. Consulte
as propriedades rust_library
para mais detalhes.
protos
Essa é uma lista de caminhos relativos aos arquivos protobuf para gerar a
interface protobuf. Os nomes de arquivo base precisam ser exclusivos em protos
e grpc_protos
.
grpc_protos
O grpc_protos
consiste em uma lista de caminhos relativos aos arquivos protobuf que
definem grpcs
para gerar a interface protobuf. Os nomes de arquivo base precisam ser exclusivos
em protos
e grpc_protos
.
source_stem
source_stem
é o nome do arquivo de origem gerado que pode ser incluído.
Essa é uma definição de campo obrigatória, mesmo se você estiver usando as vinculações como uma
caixa, porque a propriedade stem
controla apenas o nome do arquivo de saída das
variantes da biblioteca gerada. Ao contrário de outros geradores de origem, o nome do arquivo usa
mod_ como prefixo, assim, o nome final fica mod_<stem>. Isso evita
conflitos de nome com origens geradas de cada proto.
Além disso, como o módulo de vinculações bindgen, o conjunto completo de propriedades da biblioteca também está disponível para controlar a compilação da biblioteca, embora raramente seja necessário definir ou mudar as propriedades.