Консолидация грузовых зависимостей
У меня есть проект, который имеет зависимость (утилита 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>
). Я не выглядел супер усердно, но это поведение, кажется, не описано ни в одном очевидном месте. Мой второй вопрос: это правильный способ объединить зависимости? Есть ли место, где я могу найти больше информации об этом?
И шаги для воспроизведения:
- Создайте новый проект:
cargo new --bin ironapp
;cd ironapp
, - Создайте зависимость cookie:
cargo new cookie_util
, - В
cookie_util/Cargo.toml
добавить одну зависимость:iron = ">= 0.3, <= 0.4"
, - В
Cargo.toml
добавить две зависимости:iron = "0.3.0"
а такжеcookie_util = { path = "cookie_util"}
, cargo build
, Убедитесь, что две версии железа требуются вCargo.lock
,- Бежать
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
,