Protobuf 모듈

빌드 시스템은 rust_protobuf 모듈 유형을 통해 protobuf 인터페이스의 생성을 지원합니다.

기본적인 protobuf 코드 생성은 rust-protobuf 크레이트를 사용하여 진행됩니다. 이 사용법에 관한 도움말을 보려면 관련 protobuf 예시가 포함된 GitHub 프로젝트 페이지를 참고하세요.

gRPC protobuf도 지원되며, 생성은 grpc-rs 크레이트를 사용하여 진행됩니다. 이 사용법에 관한 도움말을 보려면 관련 gRPC GitHub 프로젝트 페이지의 도움말을 참고하세요.

기본적인 rust_protobuf 빌드 사용법

다음은 protobuf 모듈을 정의하고 이 모듈을 크레이트로 사용하는 예입니다. 주요 속성 및 사용법에 관한 자세한 내용은 rust_protobuf 정의 섹션을 참고하세요.

타사 코드의 경우와 같이 protobuf로 생성된 코드를 include!() 매크로를 통해 사용해야 하는 경우 소스 생성기 페이지에서 예를 참고하세요. (이 예에서는 rust_bindgen 모듈을 사용하지만, 소스 포함 방법은 모든 소스 생성기에서 동일합니다.)

rust_protobuf Android.bp 모듈 정의

Android.bp를 기준으로 src/protos/my.proto에 있다고 proto가 가정하겠습니다. 이 경우 모듈은 다음과 같이 정의됩니다.

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 기본 파일 이름은 고유해야 합니다. 예를 들어, 다음과 같이 정의된 rust_protobuf를 살펴보겠습니다.

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

이 크레이트 내의 여러 proto는 다음과 같이 액세스됩니다.

// 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 모듈 유형의 고유한 동작을 나타내는 속성입니다.

stem, name, crate_name

rust_protobuf는 라이브러리 변형을 생성하므로 이 세 가지 속성에도 rust_library 모듈과 동일한 요구사항이 적용됩니다. 자세한 내용은 rust_library 속성을 참고하세요.

protos

protobuf 인터페이스를 생성하기 위한 경로의 목록으로, 경로는 protobuf 파일을 기준으로 하는 상대 경로입니다. 기본 파일 이름은 protosgrpc_protos에서 고유해야 합니다.

grpc_protos

grpc_protosgrpcs를 정의하여 protobuf 인터페이스를 생성하기 위한 경로의 목록을 포함합니다. 경로는 protobuf 파일의 기준으로 하는 상대 경로입니다. 기본 파일 이름은 protosgrpc_protos에서 고유해야 합니다.

source_stem

source_stem은 포함할 수 있는 생성된 소스 파일의 파일 이름입니다. 필수 필드 정의입니다. stem 속성은 생성된 라이브러리 변형의 출력 파일 이름만 제어하므로, 바인딩을 크레이트로 사용하는 경우에도 필수입니다. 다른 소스 생성기와 달리 파일 이름 앞에 mod_ 접두사가 붙어서 최종 파일 이름은 mod_<stem>가 됩니다. 이를 통해 각 proto에서 생성된 소스와의 이름 충돌이 방지됩니다.

또한, bindgen 바인딩 모듈과 마찬가지로 라이브러리 속성 전체를 사용하여 라이브러리 컴파일을 제어할 수 있습니다. 단, 속성 전체를 정의하거나 변경해야 하는 경우는 드뭅니다.