O sistema de compilação suporta a geração de interfaces protobuf por meio do tipo de módulo rust_protobuf
.
A geração de código protobuf básico é realizada com o engradado rust-protobuf
. Para visualizar a documentação sobre esse uso, consulte a página do projeto GitHub com exemplos de protobuf correspondentes.
Protobufs gRPC também são suportados, com geração fornecida pela grade grpc-rs
. Para visualizar a documentação sobre esse uso, consulte a documentação na página do projeto gRPC GitHub correspondente.
Uso básico de compilação rust_protobuf
O seguinte fornece um exemplo de definição de um módulo protobuf e uso desse módulo como um engradado. Mais detalhes sobre propriedades importantes e como elas são usadas estão na seção Definindo um rust_protobuf
.
Se você precisar usar o código gerado pelo protobuf por meio de uma macro include!()
, como para código de terceiros, consulte a página Geradores de código-fonte para obter um exemplo. (O exemplo usa um módulo rust_bindgen
, mas o meio de inclusão de fonte é o mesmo para todos os geradores de fonte.)
Definindo um módulo rust_protobuf Android.bp
Assuma algum proto em src/protos/my.proto
relativo ao seu Android.bp; o módulo é então definido como o seguinte:
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 esta grade é definida referenciando-a 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 dos módulos rust_protobuf
Cada arquivo protobuf é organizado como seu próprio módulo dentro do engradado, tomando o nome do arquivo protobuf. Isso significa que todos os nomes de arquivo proto base devem ser exclusivos. Por exemplo, pegue um rust_protobuf
definido da seguinte forma:
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 desta caixa seriam acessados da seguinte forma:
// 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 notáveis de rust_protobuf
As propriedades definidas abaixo são adicionais às propriedades comuns importantes que se aplicam a todos os módulos. Eles são particularmente importantes para os módulos protobuf Rust ou exibem um comportamento exclusivo específico para o tipo de módulo rust_protobuf
.
haste, nome, crate_name
rust_protobuf
produz variantes de biblioteca, portanto, existem os mesmos requisitos para essas três propriedades que para os módulos rust_library
. Consulte as propriedades rust_library
para obter detalhes.
proto
Esta é uma lista de caminhos relativos para os arquivos protobuf para gerar a interface protobuf. Os nomes de arquivo base devem ser exclusivos entre protos
e grpc_protos
.
grpc_protos
O grpc_protos
consiste em uma lista de caminhos relativos para os arquivos protobuf que definem grpcs
para gerar a interface protobuf. Os nomes de arquivo base devem ser exclusivos entre protos
e grpc_protos
.
fonte_haste
source_stem
é o nome do arquivo de origem gerado que pode ser incluído. Esta é uma definição de campo obrigatória, mesmo se você estiver usando as ligações como uma grade, já que a propriedade stem
controla apenas o nome do arquivo de saída para as variantes de biblioteca geradas. Ao contrário de outros geradores de fonte, o nome do arquivo é prefixado por mod_ , tornando o nome do arquivo final mod_<stem> . Isso evita colisões de nomes com fontes geradas de cada proto.
Além disso, como o módulo bindgen bindings, o conjunto completo de propriedades da biblioteca também está disponível para controlar a compilação da biblioteca, embora raramente precisem ser definidas ou alteradas.