Как указать точную версию зависимости?

я использую

$ 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;

to 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, которую я указал? Что я делаю неправильно?


person user1244932    schedule 20.07.2017    source источник
comment
См. Также stackoverflow.com/q/30826513/155423   -  person Shepmaster    schedule 21.07.2017


Ответы (2)


TL;DR:

my-crate = "=1.2.3"

Чтение документации - вообще отличная идея. В этом случае в документации по грузовым перевозкам есть целый раздел на указание зависимостей:

Поскольку в этой строке нет операторов, она интерпретируется так же, как если бы мы указали "^0.1.12", что называется требованием каретки.

Требования к картам позволяют выполнять обновления, совместимые с SemVer, до указанной версии. Обновление разрешено, если новый номер версии не изменяет крайнюю левую ненулевую цифру в основной, второстепенной группировке исправлений.

А также

Требования к неравенству позволяют вручную указать диапазон версий или точную версию, от которой следует зависеть.

Вот несколько примеров требований неравенства:

= 1.2.3

Что я делаю неправильно?

Я бы сказал, что без смягчающих обстоятельств пытаться указать точную версию неправильно. Как правило, очень мало причин заставлять пользователей вашего кода придерживаться более старой версии ящика и не позволять им получать исправления ошибок.

Cargo.lock - правильный инструмент. чтобы избежать развертывания вашего приложения с несовместимым набором зависимостей.

person Shepmaster    schedule 20.07.2017
comment
Есть отличная и удручающе распространенная причина: кто-то в графе зависимостей нарушил совместимость. Но в этом случае я обычно вместо этого указываю максимальную версию; может быть какая-то другая причина, по которой конкретная зависимость ограничивается каким-то другим пакетом. - person DK.; 21.07.2017

Точные версии начинаются с символа =. Это одно из требований к сравнению (ранее называется требованием неравенства).

lazy_static = "= 0.2.2"

По умолчанию используется требование каретки (например, 0.2.2 эквивалентно ^0.2.2), которое принимает второстепенные обновления и обновления версий исправлений (или просто обновления исправлений, если основное значение равно 0). Если у вас нет веской причины запретить это, часто рекомендуется оставить спецификатор по умолчанию как есть.

person E_net4 the curator    schedule 20.07.2017