如何在脚本中使用本地项目文件 build.rs?



如何使用本地文件而不在build.rs中包含它们的绝对路径?例如,我有let proto_file_glob_paths: Paths = glob("../proto/**/*.proto").unwrap();.

我在build.rs中使用相对路径,因为我不想对文件的绝对路径进行硬编码,以便它适用于其他开发人员机器。该版本适用于cargo buildcargo 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.rssrc/的目录,以便我可以动态创建相对/绝对路径。即使CARGO_MANIFEST_DIR对于buildpublish来说也是不同的.


项目细节:我还有其他代码行可以使用其他包生成 rust 代码,这在cargo buildcargo 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文件添加到includeCargo.toml

最新更新