Консолидация грузовых зависимостей

У меня есть проект, который имеет зависимость (утилита cookie), которая имеет зависимость от железа >= 0.3, <= 0.4,

Мой проект зависит от железа 0.3 (так что я могу использовать router промежуточное ПО, которое еще не было обновлено до последней версии).

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

Тем не менее, я могу сделать:

cargo update -p <cookie utility>

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

По-видимому, я не могу указать версию зависимости зависимости: установить конкретную версию зависимости проекта в Cargo.toml или Cargo.lock.

Было бы хорошо, если бы груз мог догадаться, что я хочу использовать единственную версию железа, но я понимаю, почему это не может. Однако я не понимаю, почему cargo update -p <package> на самом деле работает; кажется не интуитивным, что он обновит зависимость для пакета.


Я предполагаю, что мой первый реальный вопрос: как я могу указать зависимости зависимостей (когда и только когда нужная версия находится в пределах поддерживаемого диапазона версий этой библиотеки)? Я не думаю, что решения, предложенные в вопросе, связанном выше, являются идеальными. Я чувствую, что было бы лучше, если бы Cargo мог хорошо это поддерживать, чтобы библиотеки могли оставлять диапазоны зависимостей настолько открытыми, насколько позволяет их функциональность.

В то же время я нашел этот "трюк", который, кажется, делает то, что я хочу (cargo update -p <pkg>). Я не выглядел супер усердно, но это поведение, кажется, не описано ни в одном очевидном месте. Мой второй вопрос: это правильный способ объединить зависимости? Есть ли место, где я могу найти больше информации об этом?


И шаги для воспроизведения:

  1. Создайте новый проект: cargo new --bin ironapp; cd ironapp,
  2. Создайте зависимость cookie: cargo new cookie_util,
  3. В cookie_util/Cargo.toml добавить одну зависимость: iron = ">= 0.3, <= 0.4",
  4. В Cargo.toml добавить две зависимости: iron = "0.3.0" а также cookie_util = { path = "cookie_util"},
  5. cargo build, Убедитесь, что две версии железа требуются в Cargo.lock,
  6. Бежать cargo update -p cookie_util от 1 до 4 (или более) раз. В конце концов это удалит зависимость от iron 0.4.0,

Я только что проверил это на rustc-1.10.0/cargo-0.11.0. Я убедился target а также Cargo.lock оба отсутствовали в начале шага 1.

1 ответ

Прочитав комментарии " Cargo / Issues / 2064", я понял, что более надежным способом решения этих типов зависимостей является использование --precise флаг. Для моего примера

cargo update -p iron:0.4.0 --precise 0.3.0

удаляет ненужную зависимость Это требует одного копаться в Cargo.lock и вручную определить, где могут сходиться зависимости, но это гораздо лучше, чем запуск cargo update -p <pkg> и надеяться на лучшее или редактировать вручную Cargo.lock,

Другие вопросы по тегам