如何指定依赖项的确切版本?

use*_*932 3 rust rust-cargo

我正在使用

$ cargo --version
cargo 0.21.0-beta (7e00b82d9 2017-07-17)
Run Code Online (Sandbox Code Playgroud)

我创建了一个简单的项目cargo new --bin test1,然后我添加了一个依赖项:

[dependencies]
lazy_static = "0.2.2"
Run Code Online (Sandbox Code Playgroud)

到Cargo.toml(根据这个版本存在)和

#[macro_use]
extern crate lazy_static;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

为什么cargo build编译最后一个版本0.2.8而不是0.2.2我指定的版本?我究竟做错了什么?

E_n*_*ate 11

精确版本前缀=.这是"不平等"版本要求之一.

lazy_static = "= 0.2.2"
Run Code Online (Sandbox Code Playgroud)

默认值是插入符号要求(例如0.2.2,相当于^0.2.2),它接受次要版本和补丁版本更新(如果是主要版本,则只接受补丁更新0).除非你有充分的理由不允许这样做,否则通常建议保留默认说明符.


She*_*ter 5

阅读文档通常是个好主意.在这种情况下,Cargo文档有一个关于指定依赖关系的完整部分:

由于此字符串中没有任何运算符,因此它的解释方式与我们指定的方式相同"^0.1.12",称为插入符号要求.

插入要求允许SemVer兼容更新指定版本.如果新版本号不修改major,minor,patch分组中最左边的非零数字,则允许更新.

以及

不等式要求允许手动指定要依赖的版本范围或确切版本.

以下是不平等要求的一些示例:

= 1.2.3
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我会说,在没有情有可原的情况下,试图指定一个确切的版本是错误的.通常没有什么理由强迫您的代码用户坚持使用较旧版本的包,并防止他们修复错误.

Cargo.lock是避免使用一组不一致的依赖项部署应用程序的正确工具.

  • 有一个极好的且令人沮丧的普遍原因:因为依赖性图中的某个人破坏了兼容性。但是在那种情况下,我通常指定一个* maximum *版本。可能还有其他原因导致特定依赖项受到其他软件包的限制。 (3认同)