工作空间目录是否有 Cargo 环境变量?

Dan*_*ath 5 rust rust-cargo

我的工作区中有以下项目:

Workspacefolder
 |
 +-- Project A
 |    |
 |    +-- build.rs
 |
 +-- Dep
 |    |
 |    +-- test.json  
 |
 +-Cargo.toml
Run Code Online (Sandbox Code Playgroud)

Project A,有一种想要以一种不依赖平台且与CI配合良好的方式来 build.rs开放。test.json

我正在寻找一个CARGO_WORKSPACE环境变量,因为这样我就可以说Path::new(&workspace_dir).join("/Dep/test.json").

Woj*_*ilo 6

现在有一个更简单的方法:

fn workspace_dir() -> PathBuf {
    let output = std::process::Command::new(env!("CARGO"))
        .arg("locate-project")
        .arg("--workspace")
        .arg("--message-format=plain")
        .output()
        .unwrap()
        .stdout;
    let cargo_path = Path::new(std::str::from_utf8(&output).unwrap().trim());
    cargo_path.parent().unwrap().to_path_buf()
}
Run Code Online (Sandbox Code Playgroud)


She*_*ter 2

不,不适用于与 Rust 1.16.0 捆绑的 Cargo 版本。您可以通过打印构建脚本中的所有环境变量来自行验证这一点:

\n\n
use std::fs::File;\nuse std::io::Write;\n\nfn main() {\n    let mut dump = File::create("/tmp/dump").expect("unable to open");\n    for (k, v) in std::env::vars() {\n        writeln!(&mut dump, "{} -> {}", k, v).expect("unable to write")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的机器上,这会产生:

\n\n
use std::fs::File;\nuse std::io::Write;\n\nfn main() {\n    let mut dump = File::create("/tmp/dump").expect("unable to open");\n    for (k, v) in std::env::vars() {\n        writeln!(&mut dump, "{} -> {}", k, v).expect("unable to write")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

我不知道为什么你不能这样做

\n\n
Path::new(&manifest_dir).join("..").join("Dep").join("test.json")\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已将每个目录拆分为单独的调用 \xe2\x80\x94 ,从而避免了指定目录分隔符与平台无关的需要。

\n