如何使用本地文件而不在build.rs
中包含它们的绝对路径?例如,我有let proto_file_glob_paths: Paths = glob("../proto/**/*.proto").unwrap();
.
我在build.rs
中使用相对路径,因为我不想对文件的绝对路径进行硬编码,以便它适用于其他开发人员机器。该版本适用于cargo build
和cargo run
,但不能cargo publish
。这是因为运行cargo publish
时工作目录/路径不同。
在cargo build
中,env::current_dir()
是:
project_name/target/debug/build/project_name-70e21ac88134b5a1/build-script-build
在cargo publish
中,env::current_dir()
是:
project_name/target/package/project_name-x.y.z/target/debug/build/project_name-xxxxxxx/build-script-build
我不知道我可以使用任何环境变量来访问build.rs
或src/
的目录,以便我可以动态创建相对/绝对路径。即使CARGO_MANIFEST_DIR
对于build
和publish
来说也是不同的.
项目细节:我还有其他代码行可以使用其他包生成 rust 代码,这在cargo build
和cargo run
中工作正常。
在@Cerberus和@ColonelThirtyTwo的一些非常有用的提示之后,我只是:
- 将本地文件复制到 crate 根目录中。在运行
cargo build
之前,我编写了一个脚本来执行此操作。当然,我需要更新相对路径以使用proto/
而不是../proto/
. - 将
proto
目录添加到gitignore
文件中 - 并将
proto
目录添加到Cargo.toml
中的package.include
中,因为它不会被包括在内,因为它被 gitignore :
[package]
...
include = ["**/*.rs", "Cargo.toml", "Cargo.lock", "config.json", "proto"]
我的错误是:
- 我以为
../proto
应该有效,但正如Cerberus解释的那样,它不会。因为板条箱的用户会丢失文件。 - 我没有将
proto
文件添加到include
Cargo.toml