大约如果包括由build.rs
脚本生成一个文件是什么。该脚本可以扫描给定的目录并生成适当的文件。
我确实有一个可以链接到的例子,但它包含了欧拉项目解决方案的解决方案,所以我不确定人们对此的看法。
这里是build.rs
,我使用:
// Generate the problem list based on available modules.
use std::env;
use std::fs;
use std::io::prelude::*;
use std::fs::File;
use std::path::Path;
use regex::Regex;
extern crate regex;
fn main() {
let odir = env::var("OUT_DIR").unwrap();
let cwd = env::current_dir().unwrap().to_str().unwrap().to_owned();
let dst = Path::new(&odir);
let gen_name = dst.join("plist.rs");
let mut f = File::create(&gen_name).unwrap();
writeln!(&mut f, "// Auto-generated, do not edit.").unwrap();
writeln!(&mut f, "").unwrap();
writeln!(&mut f, "pub use super::Problem;").unwrap();
writeln!(&mut f, "").unwrap();
let problems = get_problems();
// Generate the inputs.
for &p in problems.iter() {
writeln!(&mut f, "#[path=\"{1}/src/pr{0:03}.rs\"] mod pr{0:03};", p, cwd).unwrap();
}
writeln!(&mut f, "").unwrap();
// Make the problem set.
writeln!(&mut f, "pub fn make() -> Vec<Box<Problem + 'static>> {{").unwrap();
writeln!(&mut f, " let mut probs = Vec::new();").unwrap();
for &p in problems.iter() {
writeln!(&mut f, " add_problem!(probs, pr{:03}::Solution);", p).unwrap();
}
writeln!(&mut f, " probs").unwrap();
writeln!(&mut f, "}}").unwrap();
drop(f);
}
// Get all of the problems, based on standard filenames of "src/prxxx.rs" where xxx is the problem
// number. Returns the result, sorted.
fn get_problems() -> Vec<u32> {
let mut result = vec![];
let re = Regex::new(r"^.*/pr(\d\d\d)\.rs$").unwrap();
for entry in fs::read_dir(&Path::new("src")).unwrap() {
let entry = entry.unwrap();
let p = entry.path();
let n = p.as_os_str().to_str();
let name = match n {
Some(n) => n,
None => continue,
};
match re.captures(name) {
None => continue,
Some(cap) => {
let num: u32 = cap.at(1).unwrap().parse().unwrap();
result.push(num);
},
}
}
result.sort();
result
}
src
下另一个源文件则有以下几点:
include!(concat!(env!("OUT_DIR"), "/plist.rs"));
我不认为你可以。本质上,你要求反思,这并不是你所需要的。作为一个例子,考虑'#[test]'属性,它基本上做了你想要的同样的事情 - 它收集所有注释的函数并调用它们。这是作为编译器本身的补充而实现的,而不是大多数程序员可用的技术。相反,请考虑增强文件转换工具,以生成一个您可以始终信任的知名和必需符号。 – Shepmaster
如果我要求有一个顶级proto文件为所有其他proto文件执行了“import .proto”(在实际的.proto文件中),那该怎么办?如果我这样做了,我可以包括那个顶层。rs文件(将被编译),然后使用返回FileDescriptorProto来获得其他原型结构的方法?也许我不完全理解FileDescriptorProto()方法是如何工作的... –