Как генерировать коды, используя прост в ржавчине? - PullRequest
1 голос
/ 21 сентября 2019

Я не знаю, как генерировать коды, используя prost_build

Я прочитал документы, но они не дают подробной команды генерации кода.Я набираю cargo build, но коды не генерируются.

my build.rs

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

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

my 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

Нет ошибки сборки, но я не вижу, где находятся сгенерированные коды.Любая помощь будет оценена!

1 Ответ

2 голосов
/ 22 сентября 2019

Вы правы, это не очень хорошо объяснено в документах, и это из-за того, как работают скрипты сборки.Ну, отчасти.

Ваши реализации 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 при условии, что она нормальная, не, что важно для вас. Однако функциональная схема есть).

...