Cargo install update: как обновлять бинарные крейты в Rust

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«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 сама проверяет, есть ли новая версия, и если есть — скачивает бинарник. Компиляция не нужна.

Плюсы: