"git submodule update" in build.rs with std::process::Command 无效
"git submodule update" in build.rs with std::process::Command has no effect
我正在尝试将 C++ 软件移植到 Rust,其中一个部分是使用 C++ 库获取 git 子模块。我想将该操作集成到我的自定义 build.rs 脚本中,而不是 运行 cargo build
之前的 。这是我的 build.rs
:
fn main() {
std::process::Command::new("git")
.args([
"submodule",
"update",
"--init",
"--depth 1",
"--recommend-shallow",
])
.output()
.expect("Failed to fetch git submodules!");
// here C++ code compilation with cc::Build happens
}
不幸的是:命令没有执行 -> 没有获取子模块 -> C++ 编译器开始抱怨缺少 headers -> 货物抛出错误。否则 build.rs
完全没问题,因为它在 运行 git submodule update
之后在 cargo build
之前手动工作得很好。令人惊讶的是,将命令更改为 echo cargo:warning=test
,使用 io::stdout().write_all(&output.stdout).unwrap();
捕获 std::process::Command
和 的输出导致 cargo 正确报告警告。 touch
测试文件,然后在编译后 rm
测试文件也能正常工作。为什么 git
不起作用,但这些命令却起作用?
我在尝试解决此问题时不小心掉落了子模块,这是我通过 运行 git submodule update
手动检测到的,但没有任何效果。 cargo build
完美 在 中描述的修复后自动工作。请假装这没有发生,你没有看到这个问题。
给定 , I'd also like to suggest taking a look at the return type of std::process::Command::output
。这是一个 std::io::Result
,虽然我不能确定,但我希望它会失败,例如如果指定的命令不可访问,但 return non-zero 退出代码 .
上的 Ok
变体
您可以(并且可能应该)在您 运行 std::process::Command
时从获得的 Output
结构中检查退出代码,这样您就可以查明构建脚本的步骤失败。
我正在尝试将 C++ 软件移植到 Rust,其中一个部分是使用 C++ 库获取 git 子模块。我想将该操作集成到我的自定义 build.rs 脚本中,而不是 运行 cargo build
之前的 build.rs
:
fn main() {
std::process::Command::new("git")
.args([
"submodule",
"update",
"--init",
"--depth 1",
"--recommend-shallow",
])
.output()
.expect("Failed to fetch git submodules!");
// here C++ code compilation with cc::Build happens
}
不幸的是:命令没有执行 -> 没有获取子模块 -> C++ 编译器开始抱怨缺少 headers -> 货物抛出错误。否则 build.rs
完全没问题,因为它在 运行 git submodule update
之后在 cargo build
之前手动工作得很好。令人惊讶的是,将命令更改为 echo cargo:warning=test
,使用 io::stdout().write_all(&output.stdout).unwrap();
捕获 std::process::Command
和 touch
测试文件,然后在编译后 rm
测试文件也能正常工作。为什么 git
不起作用,但这些命令却起作用?
我在尝试解决此问题时不小心掉落了子模块,这是我通过 运行 git submodule update
手动检测到的,但没有任何效果。 cargo build
完美 在
给定 std::process::Command::output
。这是一个 std::io::Result
,虽然我不能确定,但我希望它会失败,例如如果指定的命令不可访问,但 return non-zero 退出代码 .
Ok
变体
您可以(并且可能应该)在您 运行 std::process::Command
时从获得的 Output
结构中检查退出代码,这样您就可以查明构建脚本的步骤失败。