Cargo 可以在编译前运行外部工具吗?

问题描述 投票:0回答:3

是否可以在编译代码之前让 Cargo 运行外部工具?

我遇到的确切问题:

我有一个使用 re2rust 创建的解析器生成器。该解析器生成器将文件作为输入并生成 Rust 代码(源文件)。我需要在编译核心之前运行解析器生成器。理想情况下,仅当原始文件被修改时。

我找不到有关如何执行此操作的货物文档。

rust rust-cargo
3个回答
1
投票

您可以使用

build.rs
脚本。文档位于here,但您的用例的要点如下

fn main() {
    println!("cargo:rerun-if-changed=path/to/template");
    Command::new("re2rust")
        .arg(/*whatever*/)
        .output()
        .expect("failed to execute process")
}

1
投票

您可能想创建一个

build.rs
文件。 它可以做 Rust 二进制文件可以做的任何事情。

fn main() -> std::io::Result<()> {
    println!("cargo:rerun-if-changed=re2rust/templates");
    Command::new("re2rust").output()?;
    Ok(())
}

1
投票

为了完整起见,以下是该情况的完整

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");
}
© www.soinside.com 2019 - 2024. All rights reserved.