Módulos de protobuf

El sistema de compilación admite la generación de interfaces de protobuf a través del tipo de módulo rust_protobuf.

La generación básica de código de protobuf se realiza con el contenedor rust-protobuf. Para ver la documentación sobre este uso, consulta la página del proyecto de GitHub con los ejemplos correspondientes de protobuf.

Los protobufs de gRPC también son compatibles, y el contenedor grpc-rs proporciona la generación. Para ver la documentación sobre este uso, consulta la página del proyecto de GitHub de gRPC correspondiente.

Uso básico de compilación de rust_protobuf

A continuación, se proporciona un ejemplo de cómo definir un módulo protobuf y usar ese módulo como contenedor. Obtén más información sobre propiedades importantes y cómo se usan en la sección Cómo definir un rust_protobuf.

Si necesitas usar el código generado de protobuf por medio de una macro include!() (por ejemplo, para código de terceros), consulta la página generadores de fuentes para ver un ejemplo. (En el ejemplo, se usa un módulo rust_bindgen, pero los medios de inclusión de fuentes son los mismos para todos los generadores).

Cómo definir un módulo rust_protobuf con formato Android.bp

Supón que hay un proto en src/protos/my.proto en relación con tu Android.bp. El módulo se define de la siguiente manera:

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 biblioteca que usa este contenedor se define haciendo referencia a ella como si fuera cualquier otra dependencia de biblioteca:

rust_binary {
    name: "hello_rust_proto",
    srcs: ["src/main.rs"],
    rustlibs: ["libmy_proto"],
}

Estructura de contenedor de los módulos rust_protobuf

Cada archivo protobuf está organizado como su propio módulo dentro del contenedor y toma el nombre del archivo protobuf. Por lo tanto, todos los nombres de archivo base de los proto deben ser únicos. Por ejemplo, toma un rust_protobuf definido de la siguiente manera:

rust_protobuf {
    name: "libfoo",
    crate_name: "foo",
    protos: ["a.proto", "b.proto"],
    grpc_protos: ["c.proto"],
    source_stem: "my_proto_source",
}

Se accederá a los diferentes protos dentro de este contenedor de la siguiente manera:

// 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

Propiedades notables de rust_protobuf

Las propiedades que se definen a continuación se agregan a las propiedades comunes importantes que se aplican a todos los módulos. Estas son particularmente importantes para los módulos protobuf de Rust o presentan un comportamiento único específico para el tipo de módulo rust_protobuf.

stem, name, crate_name

rust_protobuf produce variantes de biblioteca, por lo que existen los mismos requisitos para estas tres propiedades que para los módulos rust_library. Consulta las propiedades de rust_library para obtener más detalles.

protos

Esta es una lista de rutas de acceso relativas a los archivos protobuf para generar la interfaz de protobuf. Los nombres de archivo base deben ser únicos en protos y grpc_protos.

grpc_protos

grpc_protos consiste en una lista de rutas de acceso relativas a los archivos protobuf que definen grpcs a fin de generar la interfaz de protobuf. Los nombres de archivo base deben ser únicos en protos y grpc_protos.

source_stem

source_stem es el nombre del archivo fuente generado que se puede incluir. Esta es una definición de campo obligatorio, incluso si usas las vinculaciones como contenedor, ya que la propiedad stem solo controla el nombre de archivo de salida para las variantes de la biblioteca generadas. A diferencia de otros generadores de fuentes, el nombre del archivo tiene el prefijo mod_, con lo cual, el nombre final es mod_<stem>. Esto evita conflictos de nombres con las fuentes generadas de cada proto.

Además, al igual que el módulo de vinculaciones de bindgen, el conjunto completo de propiedades de la biblioteca también está disponible para controlar la compilación de la biblioteca, aunque rara vez deben definirse o cambiarse.