如何在 Rust 中使用 prost 生成代码?

How to generate codes using prost in rust?

我不知道如何使用 prost_build

生成代码

我看过文档,但是没有给出生成代码的详细命令。 我输入 cargo build 但没有生成代码。

我的build.rs

extern crate prost_build;
fn main() {
    prost_build::compile_protos(&["src/items.proto"],
                                &["src/"]).unwrap();
}

我的Cargo.toml

[package]
name = "snazzy"
version = "0.1.0"
authors = ["xxx <xxx@xxx.com>"]
edition = "2018"
build = "build.rs"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
bytes = "0.4"
prost = "0.5"

[build-dependencies]
prost-build = { version = "0.4"  }

我的items.proto

syntax = "proto3";

package snazzy.items;

message Shirt {
    enum Size {
        SMALL = 0;
        MEDIUM = 1;
        LARGE = 2;
    }
    string color = 1;
    Size size = 2;
}

我的文件树:

.
├── build.rs
├── Cargo.lock
├── Cargo.toml
└── src
    ├── items.proto
    └── main.rs

没有构建错误,但我看不到生成的代码在哪里。 任何帮助将不胜感激!

你是对的,这在文档中没有很好地解释,这是因为构建脚本的工作方式。嗯,部分。

您的 protobuf 实现在 target/{yourArch}/build/{yourCrateName}-{hash}/out.

如果没有环境变量,这将非常难以实现。文档的重要部分是以下代码片段突出显示了包含内容:

pub mod items {
    include!(concat!(env!("OUT_DIR"), "/snazzy.items.rs"));
}

这包括OUT_DIR处可用的文件(上面指定的目录,编译时自动填写)和protobuf实现的名称(你在protobuf文件中的包名),并使它的所有内容crate::items.

下可用的结构

将文件驻留在构建目录中是有意义的,因为它们是构建产物。在你的箱子的 src 文件夹中生成代码会导致混乱,无论是在版本控制还是项目完整性方面(你会有重复的信息,并且 protobuf 实现,只要它是理智的,是 对你很重要。但是,功能蓝图很重要)。