我的工作区中有以下项目:
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").
现在有一个更简单的方法:
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)
不,不适用于与 Rust 1.16.0 捆绑的 Cargo 版本。您可以通过打印构建脚本中的所有环境变量来自行验证这一点:
\n\nuse 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}\nRun Code Online (Sandbox Code Playgroud)\n\n在我的机器上,这会产生:
\n\nuse 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我不知道为什么你不能这样做
\n\nPath::new(&manifest_dir).join("..").join("Dep").join("test.json")\nRun Code Online (Sandbox Code Playgroud)\n\n我已将每个目录拆分为单独的调用 \xe2\x80\x94 ,从而避免了指定目录分隔符与平台无关的需要。
\n| 归档时间: |
|
| 查看次数: |
5052 次 |
| 最近记录: |