如何在编译期间生成文本文件并将其内容包含在输出中?

时间:2017-11-10 06:59:48

标签: build rust embedded-resource rust-cargo build-script

我正在尝试与How to create a static string at compile time几乎相同。

build.rs

use std::{env};
use std::path::Path;
use std::io::{Write, BufWriter};
use std::fs::File;

fn main() {
    let out_dir = env::var("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("file_path.txt");
    let mut f = BufWriter::new(File::create(&dest_path).unwrap());

    let long_string = dest_path.display();
    write!(f, "{}", long_string).unwrap();
}

main.rs

fn main() {

    static LONG_STRING: &'static str = include_str!("file_path.txt");
    println!("{}", LONG_STRING);
}

cargo build我收到错误:

error: couldn't read src\file_path.txt: The system cannot find the file specified. (os error 2)
 --> src\main.rs:3:40
  |
3 |     static LONG_STRING: &'static str = include_str!("file_path.txt");
  |                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我可以看到该文件是在

生成的
X:\source\github\rust-build-script-example\target\debug\build\rust-build-script-example-f2a03ef7abfd6b23\out\file_path.txt
  1. 我必须使用什么环境变量而不是OUT_DIR才能将file_path.txt输出到src目录?
  2. 如果#1不可能,那么如何include_str!上面目录中生成的文件而不在代码中对其进行硬编码(因为路径中似乎有一个随机生成的部分rust-build-script-example-f2a03ef7abfd6b23
  3. My GitHub repository

2 个答案:

答案 0 :(得分:3)

诀窍是

concat!(env!("OUT_DIR"), "/file_path.txt")

我改变了我的主要内容如下,它起作用了。

fn main() {

    static LONG_STRING: &'static str = include_str!(concat!(env!("OUT_DIR"), "/file_path.txt"));

    println!("{}", LONG_STRING);
}

以下crates.io文档帮助

http://doc.crates.io/build-script.html

答案 1 :(得分:0)

如果有人对更方便的方法感兴趣,我还创建了build_script_file_gen crate,可以按如下方式使用

build.rs

extern crate build_script_file_gen;
use build_script_file_gen::gen_file_str;

fn main() {
    let file_content = "Hello World!";
    gen_file_str("hello.txt", &file_content);
}

main.rs

#[macro_use]
extern crate build_script_file_gen;

fn main() {
    println!(include_file_str!("hello.txt"));
}