我有一个项目,其中包含一些 protobuf 定义并为多种(Python 和 Rust)语言构建代码。文件夹结构是这样的:
我正在使用 prost 从原始文件中生成 Rust 代码。我的
build.rs
看起来像这样:
use std::io::Result;
fn main() -> Result<()> {
prost_build::compile_protos(
// Files to be compiled
&["my.proto"],
// Include folder for protoc
&["../proto/"])?;
Ok(())
}
如果我运行
cargo build
,这可以正常工作,但它不适用于cargo publish
。在输出中,我看到 publish
似乎在 package
文件夹中创建了一个专用的 target
子文件夹。 protoc
还告诉我:
忽略 ../proto/ 因为它不存在
我想知道为什么这适用于
build
,但不适用于 publish
。有人可以解释一下吗?它可以解决吗?还是这种访问相对路径中的文件是一个坏主意?
您可以使用环境变量Cargo设置:
use std::io::Result;
fn main() -> Result<()> {
let folder_path = Path::new(std::env::var_os("CARGO_MANIFEST_DIR").unwrap()).join("../proto");
prost_build::compile_protos(
// Files to be compiled
&["my.proto"],
// Include folder for protoc
&[folder_path],
)?;
Ok(())
}