Avatar ·

Есть ли у cargo install команда для обновления установленных утилит?

Привет, коллеги! Я недавно начал активно использовать Rust для написания CLI-утилит и часто пользуюсь `cargo install`, чтобы ставить готовые инструменты из crates.io, например `ripgrep`, `bat`, `fd` и так далее. Проблема в том, что я заметил: утилиты, которые я установил, довольно быстро устаревают, но я не могу найти команду, похожую на `cargo update`, которая бы обновляла их. Каждый раз я делаю так: ```bash # Сначала удаляю старую версию cargo uninstall ripgrep # Потом ставлю заново cargo install ripgrep ``` Это жутко неудобно, особенно когда у меня установлено штук 15-20 разных утилит. Я пробовал просто запускать `cargo install ripgrep` повторно, но краш-тест показал, что если версия уже установлена, Cargo просто пишет `package `ripgrep` is already installed` и ничего не делает. Подскажите, пожалуйста, есть ли в Cargo встроенная команда для массового обновления всех установленных через `cargo install` инструментов? Или, может быть, есть какой-то плагин или внешняя утилита для этого? Или единственный способ — это писать собственный скрипт, который проходит по списку и переустанавливает всё вручную? Заранее спасибо за помощь! <<>>

Прямого эквивалента `cargo update` для `cargo install` нет, но есть отличные альтернативы

К сожалению, в Cargo действительно нет встроенной команды cargo update --installed или чего-то подобного. Разработчики Rust пока не добавили эту функциональность в ядро. Однако сообщество создало удобные решения, которые решают эту проблему гораздо элегантнее, чем ручное удаление/установка.

Вариант 1: Использование `cargo-install-update` (рекомендуемый способ)

Это самый популярный и стабильный плагин для Cargo. Он добавляет команду cargo install-update, которая умеет:

  • Проверять версии всех установленных через cargo install пакетов
  • Сравнивать их с последними версиями на crates.io
  • Обновлять только те пакеты, для которых вышла новая версия
  • Работать с конкретными пакетами, если указать их имена

Установка плагина:

cargo install cargo-install-update

Использование:

# Обновить все установленные утилиты
cargo install-update -a

# Обновить только конкретные утилиты
cargo install-update ripgrep bat fd

# Проверить, какие утилиты можно обновить (без фактического обновления)
cargo install-update -a -l

Плагин работает быстро и безопасно. Он использует кэш Cargo и не пересобирает пакеты, если версия не изменилась.

Вариант 2: Использование `cargo-update` (более легковесный)

Существует ещё один плагин — cargo-update. Он немного проще и работает по тому же принципу:

# Установка
cargo install cargo-update

# Обновление всех установленных пакетов
cargo update-all

# Обновление конкретного пакета
cargo update ripgrep

Вариант 3: Скрипт на Bash/PowerShell (если не хотите ставить плагины)

Если вы предпочитаете минимум зависимостей, можно написать простой скрипт. Вот пример для Bash (Linux/macOS):

#!/bin/bash
# Получаем список всех установленных через cargo install пакетов
cargo install --list | grep -E '^[a-zA-Z]' | awk '{print $1}' | while read -r package; do
    echo "Обновляю $package..."
    cargo install "$package" 2>/dev/null
done
echo "Готово!"

Важное замечание: Если вы используете cargo install с флагом --version для фиксации конкретной версии (например, для стабильности в CI/CD), то плагины cargo-install-update и cargo-update это учтут и не будут обновлять такие пакеты — они обновят только те, которые были установлены без указания версии.

Рекомендация

Я настоятельно рекомендую cargo-install-update. Он активно поддерживается, имеет понятный вывод и хорошо интегрируется с экосистемой Cargo. Установите его один раз и забудьте о ручном удалении/переустановке.

<<>>

Альтернативный подход: Использование `rustup` и управление через инструментарий

Если вы используете rustup (а скорее всего используете, так как это стандартный способ установки Rust), у вас есть ещё один вариант — не обновлять отдельные утилиты, а управлять всей экосистемой через компоненты rustup.

Некоторые популярные утилиты, такие как clippy, rustfmt, rust-analyzer, поставляются как компоненты rustup и обновляются вместе с компилятором:

rustup update

Для остальных утилит можно использовать cargo binstall — альтернативу cargo install, которая скачивает готовые бинарники (если они доступны) вместо компиляции из исходников. Это работает быстрее и не требует установки дополнительных плагинов для обновления:

cargo binstall ripgrep

При повторном запуске cargo binstall автоматически проверяет версию и обновляет пакет, если есть новая. Это не массовое решение, но для точечного обновления — очень удобно.

Если вам нужно массовое обновление, то без cargo-install-update или аналогичного плагина не обойтись, но для повседневной работы cargo binstall может быть хорошей альтернативой, особенно если вы часто устанавливаете новые инструменты.