«Cargo install» есть, а «cargo update» — нет? Знакомая боль каждого Rust-разработчика
Вы только что запустили cargo install ripgrep, чтобы получить свежий бинарник rg. Прошла неделя. Вы слышите, что вышла новая версия — 14.1.0 вместо 13.0.0. И тут возникает резонный вопрос: «Does cargo install have an equivalent update command?»
Этот вопрос собрал тысячи просмотров на Stack Overflow. И не зря. Дело в том, что в cargo нет встроенной команды cargo install update. Нет, вы не ослепли. Действительно нет. Но это не значит, что вы обречены вручную скачивать новые версии. Есть несколько подходов, и мы разберём их все — от простых до элегантных.
В этой статье мы не просто переведём ответ со Stack Overflow. Мы сравним подходы, покажем реальный код и дадим actionable советы. Поехали!
Почему в Cargo нет команды «update» для установленных крейтов?
Прежде чем кидаться искать баги, давайте поймём философию. cargo install предназначен для установки бинарных крейтов (тех, у которых в Cargo.toml есть секция [[bin]]). Это не менеджер пакетов в стиле apt или npm. Cargo — это прежде всего сборщик и менеджер зависимостей для проектов, а не глобальный установщик софта.
Команда cargo update существует, но она работает внутри проекта — обновляет зависимости в Cargo.lock. Для глобально установленных бинарников нужно другое решение.
Способ №1: Классическое переустановка (cargo install --force)
Самый простой и очевидный метод — переустановить крейт с флагом --force:
# Установили первый раз
cargo install ripgrep
# Через неделю — обновляем
cargo install --force ripgrep
Что происходит под капотом? Cargo скачивает последнюю версию крейта из crates.io, пересобирает и заменяет бинарник. Флаг --force заставляет перезаписать существующий файл, даже если версия та же.
Плюсы:
- Не требует установки дополнительных инструментов
- Работает всегда и везде
- Интуитивно понятно
Минусы:
- Каждый раз полная перекомпиляция (долго, если крейт большой)
- Нет проверки, вышла ли новая версия — вы просто переустанавливаете
- Неудобно, если у вас установлено 10+ крейтов
Это как переустанавливать Windows, чтобы обновить драйвер. Работает? Да. Оптимально? Нет.
Способ №2: cargo-outdated — умный детектор устаревших крейтов
Если вы хотите знать наверняка, что обновление нужно, установите cargo-outdated:
cargo install cargo-outdated
Теперь проверьте, какие крейты устарели:
cargo outdated --root ~/.cargo
Вывод покажет что-то вроде:
Package Current Latest Deps
ripgrep 13.0.0 14.1.0 -
bat 0.22.1 0.23.0 -
Затем вы можете обновить конкретный крейт через cargo install --force. Но это всё ещё два шага. Хочется автоматизации? Читайте дальше.
Плюсы:
- Показывает только те крейты, которые действительно устарели
- Работает в том числе для зависимостей проекта
- Есть опции для фильтрации
Минусы:
- Не обновляет сам — только информирует
- Требует отдельной установки
Способ №3: cargo-update (да, есть такой крейт!)
Самый элегантный ответ на вопрос «Does cargo install have an equivalent update command?» — это установить крейт cargo-update. Он добавляет команду cargo install-update (или сокращённо cargo install-update -a).
# Устанавливаем cargo-update
cargo install cargo-update
# Проверяем и обновляем все установленные крейты
cargo install-update -a
Команда cargo install-update -a делает следующее:
- Сканирует
~/.cargo/.crates2.json(список установленных крейтов) - Сравнивает с последними версиями на crates.io
- Если есть новая версия — запускает
cargo install --forceдля каждого - Пропускает те, что уже актуальны
Выглядит это так:
Checking all installed crates...
ripgrep v13.0.0 -> v14.1.0 (up-to-date)
bat v0.22.1 -> v0.23.0 (needs update)
Updating bat v0.22.1 -> v0.23.0
Compiling bat v0.23.0
Finished in 45.2s
fd-find v8.7.0 -> v8.7.0 (up-to-date)
...
Плюсы:
- Полная автоматизация: одна команда — все обновления
- Не переустанавливает то, что уже актуально
- Работает «из коробки» после установки
Минусы:
- Всё равно требует компиляции каждого крейта (но это неизбежно)
- Нужно помнить об установке самого cargo-update
Способ №4: cargo-binstall — обновление без компиляции
Если вы устали ждать компиляции, есть альтернатива — cargo-binstall. Он скачивает готовые бинарники с GitHub (если автор крейта их публикует).
# Устанавливаем binstall
cargo install cargo-binstall
# Устанавливаем или обновляем крейт через binstall
cargo binstall ripgrep
Команда cargo binstall сама проверяет, есть ли новая версия, и если есть — скачивает бинарник. Компиляция не нужна.
Плюсы:
-
Блоги
Рекомендаций по книгам
Читайте также