"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 结构中检查退出代码,这样您就可以查明构建脚本的步骤失败。