У меня есть проект, у которого есть зависимость (утилита cookie), которая имеет зависимость от iron >= 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.