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

24

我正在使用

$ cargo --version
cargo 0.21.0-beta (7e00b82d9 2017-07-17)

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

[dependencies]
lazy_static = "0.2.2"

根据这里的信息,把版本添加到Cargo.toml中即可。

#[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 版本?我做错了什么吗?


2
请参见 https://dev59.com/cl0Z5IYBdhLWcg3w_0h8 - Shepmaster
2个回答

43

简而言之:

my-crate = "=1.2.3"

通常阅读文档是一个好主意。在这种情况下,Cargo文档有一个完整的章节介绍指定依赖关系:

由于这个字符串没有任何运算符,因此它的解释方式与我们指定了 "^0.1.12" 一样,这被称为插入符需求。

插入符要求 允许 SemVer 兼容升级到指定版本。只要新版本号不修改主版本、次版本和修订版本组的最左边非零数字,就允许更新。

以及

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

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

= 1.2.3

我到底做错了什么?


我认为,在没有特殊情况的情况下,试图指定确切的版本是错误的。通常很少有理由强制您代码的用户停留在旧版本的创建中,阻止他们获得错误修复。

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


5
有一个优秀而令人沮丧的普遍原因:因为依赖图中的某个人破坏了兼容性。但在这种情况下,我通常会指定一个最大版本;可能有其他原因导致特定的依赖关系被某个其他软件包限制。 - DK.
我同意DK的观点,而是否需要精确固定版本取决于上下文。二进制文件应该精确固定版本(可以通过Cargo.lock实现),而库应该尽可能灵活,以便于需要相同子依赖项的二进制文件可以做出全面的决策。 - SwimBikeRun

16

= 前缀表示精确版本。这是其中一种比较要求(以前称为不等式要求)。

lazy_static = "= 0.2.2"

默认情况下,采用插入符要求(例如0.2.2等同于^0.2.2),该要求接受次要版本和补丁版本更新(如果主要版本是0,则只接受补丁更新)。除非您有非常好的理由禁止此操作,否则通常建议将默认的规范保留原样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接