我尝试使用命令cargo build
编译我的项目。
build.rs
extern crate csv;
use std::path::Path;
use std::fs::OpenOptions;
use std::io::BufWriter;
use std::io::Write;
#[allow(non_snake_case)]
fn processCSV(filename: &str, sourcePath: &str, enumName: &str) {
println!("Generate rust source code from schema {}",filename);
let mut ret: Vec<String> = Vec::new();
let mut rdr = csv::Reader::from_file(filename).unwrap().flexible(true);
for record in rdr.records().map(|r| r.unwrap()) {
}
let path = Path::new(sourcePath);
let file = match OpenOptions::new().write(true).create(true).open(&path) {
Ok(file) => file,
Err(..) => panic!("Cannot create file {}",path.display()),
};
let mut writer = BufWriter::new(file);
writer.write_all(b"test\n");
}
fn main() {
processCSV("../schemas/Test.csv", "./src/mod/common/StatusCode.rs", "StatusCode");
}
和 Cargo.toml
[package]
name = "rust-test"
version = "0.0.1"
build = "build.rs"
[lib]
path = "src/lib.rs"
[dependencies]
[build-dependencies]
csv = "*"
我可以看到这个错误:
src / lib.rs:1:1:1:18错误:无法找到
的箱子csv
src / lib.rs:1 extern crate csv;
但是当我将flexible(true)
更改为flexible(false)
时,它编译得很好,没有任何错误。我需要做些什么来解决这个问题?
我在Windows 7 64位上使用Rust 1.2.0。
答案 0 :(得分:5)
为flexible(false)
更改flexible(true)
对我没有任何影响;都失败了。问题是您出于某种原因选择了build-dependencies
,而不仅仅是dependencies
。
使用您在答案中提供的 src / lib.rs 文件以及 Cargo.toml 文件:
[package]
name = "stack-overflow"
version = "0.1.0"
authors = ["A. Developer <a.developer@example.com>"]
[dependencies]
csv = "*"
它汇编得很好。
如果您需要在 build.rs 和项目中访问依赖项,则需要在两个部分中包含依赖项。
答案 1 :(得分:3)
构建依赖项是a build script的依赖项,它是在构建主crate之前编译和运行的辅助二进制文件(旨在用于代码生成,构建/查找本机C库等。 )。
主代码使用的正常依赖关系应该属于“依赖关系”部分,例如
[dependencies]
csv = "0.14"
还有一个“dev-dependencies”部分,它们只是测试所需的依赖项,即它们仅被编译并用于cargo test
。这允许包装箱依赖于例如quickcheck
来运行测试而不会污染主要工件。
总之,运行cargo build
会执行以下操作:
build-dependencies
dependencies
正在运行cargo test
添加:
dev-dependencies
--test
构建主包以为任何源内#[test]
创建测试运行器(将编译器指向依赖项和dev依赖项)