我正在使用
$ cargo --version
cargo 0.21.0-beta (7e00b82d9 2017-07-17)
我使用cargo new --bin test1
创建了一个简单的项目,然后我添加了一个依赖项:
[dependencies]
lazy_static = "0.2.2"
到Cargo.toml(根据this这样的版本存在)和
#[macro_use]
extern crate lazy_static;
到src/main.rs
当我运行cargo build
时:
$ cargo build
Compiling lazy_static v0.2.8
Compiling test1 v0.1.0 (file:///tmp/test1)
warning: unused `#[macro_use]` import
--> src/main.rs:1:1
|
1 | #[macro_use]
| ^^^^^^^^^^^^
|
= note: #[warn(unused_imports)] on by default
Finished dev [unoptimized + debuginfo] target(s) in 0.49 secs
为什么cargo build
编译我指定的最后一个版本0.2.8
而不是0.2.2
?我做错了什么?
答案 0 :(得分:11)
精确版本由=
作为前缀。这是"inequality" version requirements之一。
lazy_static = "= 0.2.2"
默认值是插入符号要求(例如0.2.2
等同于^0.2.2
),它接受次要版本和补丁版本更新(如果主要版本为0
,则只接受补丁更新)。除非你有充分的理由不允许这样做,否则通常建议保留默认说明符。
答案 1 :(得分:5)
阅读文档通常是一个好主意。在这种情况下,Cargo documentation在specifying dependencies上有整个部分:
由于此字符串中没有任何运算符,因此它的解释方式与我们指定
"^0.1.12"
的方式相同,这称为插入符号要求。插入要求允许SemVer兼容更新指定版本。如果新版本号不修改major,minor,patch分组中最左边的非零数字,则允许更新。
以及
不平等要求允许手动指定要依赖的版本范围或确切版本。
以下是不平等要求的一些例子:
= 1.2.3
我做错了什么?
我说,如果没有情有可原的情况,尝试指定确切的版本是错误的。通常没有什么理由强迫您的代码用户坚持使用较旧版本的包,并防止他们修复错误。
Cargo.lock是避免使用一组不一致的依赖项部署应用程序的正确工具。