Система сборки поддерживает генерацию интерфейсов protobuf через тип модуля rust_protobuf
.
Базовая генерация кода protobuf выполняется с помощью крейта rust-protobuf
. Чтобы просмотреть документацию по этому использованию, см. страницу проекта GitHub с соответствующими примерами protobuf.
Также поддерживаются gRPC protobufs, генерация которых обеспечивается контейнером grpc-rs
. Чтобы просмотреть документацию по этому использованию, см. документацию на соответствующей странице проекта gRPC GitHub .
Использование базовой сборки rust_protobuf
Ниже приведен пример определения модуля protobuf и использования этого модуля в качестве контейнера. Более подробная информация о важных свойствах и их использовании приведена в разделе Определение rust_protobuf
.
Если вам необходимо использовать сгенерированный protobuf код через макрос include!()
, например, для стороннего кода, см. страницу Генераторы исходного кода для примера. (В примере используется модуль rust_bindgen
, но способ включения исходного кода одинаков для всех генераторов исходного кода.)
Определить модуль Rust_protobuf Android.bp
Предположим, что некоторый proto находится в src/protos/my.proto
относительно вашего Android.bp; тогда модуль определяется следующим образом:
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",
}
Библиотека, использующая этот контейнер, определяется путем ссылки на него, как если бы это была любая другая библиотечная зависимость:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
Структура ящика модулей rust_protobuf
Каждый файл protobuf организован как собственный модуль внутри контейнера, принимая имя файла protobuf. Это означает, что все имена файлов proto base должны быть уникальными. Например, возьмем rust_protobuf
, определенный следующим образом:
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
Доступ к различным прототипам в этом ящике будет осуществляться следующим образом:
// 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
Известные свойства rust_protobuf
Свойства, определенные ниже, являются дополнением к важным общим свойствам , которые применяются ко всем модулям. Они либо особенно важны для модулей Rust protobuf, либо демонстрируют уникальное поведение, характерное для типа модуля rust_protobuf
.
стебель, имя, имя_ящика
rust_protobuf
создает варианты библиотеки, поэтому для этих трех свойств существуют те же требования, что и для модулей rust_library
. Подробности см. в свойствах rust_library
.
протос
Это список относительных путей к файлам protobuf для генерации интерфейса protobuf. Базовые имена файлов должны быть уникальными в protos
и grpc_protos
.
grpc_protos
grpc_protos
состоит из списка относительных путей к файлам protobuf, которые определяют grpcs
для генерации интерфейса protobuf. Базовые имена файлов должны быть уникальными в protos
и grpc_protos
.
источник_стебель
source_stem
— это имя файла для сгенерированного исходного файла , который может быть включен. Это обязательное определение поля, даже если вы используете привязки как контейнер, поскольку свойство stem
управляет только выходным именем файла для сгенерированных вариантов библиотеки. В отличие от других генераторов исходного кода, имя файла получает префикс mod_ , что делает окончательное имя файла mod_<stem> . Это предотвращает конфликты имен с сгенерированными исходными файлами из каждого прототипа.
Кроме того, как и модуль привязок bindgen, полный набор свойств библиотеки также доступен для управления компиляцией библиотеки, хотя их редко приходится определять или изменять.