是否可以在编译代码之前让 Cargo 运行外部工具?
我遇到的确切问题:
我有一个使用 re2rust 创建的解析器生成器。该解析器生成器将文件作为输入并生成 Rust 代码(源文件)。我需要在编译核心之前运行解析器生成器。理想情况下,仅当原始文件被修改时。
我找不到有关如何执行此操作的货物文档。
您可以使用
build.rs
脚本。文档位于here,但您的用例的要点如下
fn main() {
println!("cargo:rerun-if-changed=path/to/template");
Command::new("re2rust")
.arg(/*whatever*/)
.output()
.expect("failed to execute process")
}
build.rs
文件。
它可以做 Rust 二进制文件可以做的任何事情。
fn main() -> std::io::Result<()> {
println!("cargo:rerun-if-changed=re2rust/templates");
Command::new("re2rust").output()?;
Ok(())
}
为了完整起见,以下是该情况的完整
build.rs
,即该工具仅将输出写入标准输出。
use std::fs::File;
use std::process::Command;
fn main() {
println!("cargo:rerun-if-changed=<full path from cargo root to input file>");
let rust_file = File::create("<output file>").expect("failed to open parser.rs");
Command::new("re2rust")
.current_dir("<input file dir>")
.arg("<input file>")
.stdout(rust_file)
.spawn().expect("failed to execute re2rust");
}