Moduły Protobuf

System kompilacji obsługuje generowanie interfejsów protobuf poprzez typ modułu rust_protobuf .

Podstawowe generowanie kodu protobuf odbywa się za pomocą skrzynki rust-protobuf . Aby wyświetlić dokumentację dotyczącą tego użycia, zobacz stronę projektu GitHub z odpowiednimi przykładami protobuf.

Obsługiwane są także protobufy gRPC, a generowanie zapewnia skrzynka grpc-rs . Aby wyświetlić dokumentację dotyczącą tego użycia, zapoznaj się z dokumentacją na odpowiedniej stronie projektu gRPC GitHub .

Podstawowe użycie kompilacji rust_protobuf

Poniżej przedstawiono przykład zdefiniowania modułu protobuf i użycia go jako skrzynki. Więcej szczegółów na temat ważnych właściwości i sposobu ich wykorzystania znajduje się w sekcji Definiowanie rust_protobuf .

Jeśli chcesz użyć kodu wygenerowanego przez protobuf za pośrednictwem makra include!() , na przykład w przypadku kodu innej firmy, zobacz przykład na stronie generatorów źródeł . (W przykładzie zastosowano moduł rust_bindgen , ale sposób włączenia źródła jest taki sam dla wszystkich generatorów źródeł.)

Zdefiniuj moduł rust_protobuf Android.bp

Załóżmy, że w src/protos/my.proto jest trochę proto w stosunku do twojego Android.bp; moduł jest następnie zdefiniowany w następujący sposób:

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",
}

Bibliotekę korzystającą z tej skrzynki definiuje się poprzez odniesienie do niej tak, jakby była to jakakolwiek inna zależność biblioteki:

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

Struktura skrzyniowa modułów rust_protobuf

Każdy plik protobuf jest zorganizowany jako odrębny moduł w skrzynce, przyjmując nazwę pliku protobuf. Oznacza to, że wszystkie podstawowe nazwy plików proto muszą być unikalne. Weźmy na przykład rust_protobuf zdefiniowany w następujący sposób:

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

Dostęp do różnych protosów w tej skrzyni będzie możliwy w następujący sposób:

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

Godne uwagi właściwości rust_protobuf

Właściwości zdefiniowane poniżej stanowią dodatek do ważnych wspólnych właściwości , które mają zastosowanie do wszystkich modułów. Są one albo szczególnie ważne dla modułów Rust protobuf, albo wykazują unikalne zachowanie specyficzne dla typu modułu rust_protobuf .

łodyga, nazwa, nazwa_skrzynki

rust_protobuf tworzy warianty bibliotek, więc dla tych trzech właściwości obowiązują takie same wymagania, jak w przypadku modułów rust_library . Szczegóły znajdziesz we właściwościach rust_library .

proto

To jest lista względnych ścieżek do plików protobuf służących do wygenerowania interfejsu protobuf. Podstawowe nazwy plików muszą być unikalne dla protos i grpc_protos .

grpc_protos

grpc_protos składa się z listy względnych ścieżek do plików protobuf, które definiują grpcs do generowania interfejsu protobuf. Podstawowe nazwy plików muszą być unikalne dla protos i grpc_protos .

źródło_rdzeń

source_stem to nazwa wygenerowanego pliku źródłowego , który można dołączyć. Jest to wymagana definicja pola, nawet jeśli używasz powiązań jako skrzynki, ponieważ właściwość stem kontroluje jedynie nazwę pliku wyjściowego dla wygenerowanych wariantów biblioteki. W przeciwieństwie do innych generatorów źródeł, nazwa pliku jest poprzedzona prefiksem mod_ , tworząc ostateczną nazwę pliku mod_<stem> . Zapobiega to kolizjom nazw ze źródłami wygenerowanymi z każdego proto.

Dodatkowo, podobnie jak moduł powiązań bindgen, dostępny jest również pełny zestaw właściwości biblioteki do kontrolowania kompilacji biblioteki, chociaż rzadko trzeba je definiować lub zmieniać.