blog.dopana

Back

Rustのエコシステムでは、cargo install <crate> を使うことで ripgrepbatezazellij などの高性能なCLIツールを手軽にインストールできます。

しかし、様々なツールを試しているうちに不要なバイナリが溜まってしまうことがあります。これらを安全かつ綺麗に削除するにはどうすればよいでしょうか?

本記事では、Cargoがバイナリを管理する仕組み、cargo uninstall コマンドの使い方、および手動削除の手順を分かりやすく解説します。

10歳でもわかる解説 (ELI5): Cargoのバイナリ管理の仕組み#

OSのターミナルを作業場の共通ツール掛け(ツールラック)に例えてみましょう:

  • cargo install <crate> を実行すると:Cargoはソースコードをダウンロードしてコンパイルし、完成した実行可能ファイルを $HOME/.cargo/bin という共通の棚に掛けます。同時に、管理台帳(.crates2.json)に「どのツールを掛けたか」を記録します。
  • cargo uninstall <crate> を実行すると:Cargoは管理台帳を確認し、該当クレートに紐づく実行ファイルを棚から取り外して削除し、台帳の記録を消去します。
flowchart TD
    subgraph Install["インストール (cargo install)"]
        CRATES_IO["Crates.io / Gitリポジトリ"] -->|ダウンロード & コンパイル| CARGO_BUILD["Cargoコンパイラ"]
        CARGO_BUILD -->|バイナリを配置| BIN_DIR["$HOME/.cargo/bin<br>(環境変数PATH内)"]
        CARGO_BUILD -->|メタデータを記録| METADATA[".crates2.json<br>(メタデータ追跡)"]
    end

    subgraph Uninstall["アンインストール (cargo uninstall)"]
        CMD["cargo uninstall <crate>"] -->|参照| METADATA
        CMD -->|実行ファイルを削除| BIN_DIR
        CMD -->|メタデータを更新・削除| METADATA
    end

1. インストール済みバイナリの一覧表示#

パッケージを削除する前に、現在システムにインストールされているCargoバイナリを確認します。

ターミナルで以下のコマンドを実行します:

インストール済みクレート一覧の確認
cargo install --list
bash

出力結果には、クレート名、バージョン、および含まれる実行ファイルが表示されます:

bat v0.24.0:
    bat
ripgrep v14.1.0:
    rg
cargo-update v13.3.0:
    cargo-install-update
    cargo-install-update-config
text

[!NOTE] 1つのクレートが複数のバイナリをインストールする場合があります(例:cargo-updatecargo-install-updatecargo-install-update-config の2つを生成)。また、クレート名とバイナリ名が異なる場合もあります(例:ripgrep クレートのコマンド名は rg)。

2. cargo uninstall による基本のアンインストール#

cargo install で導入したパッケージを削除する基本構文は以下のとおりです:

アンインストールの基本構文
cargo uninstall <package_name>
bash

具体例:#

例えば ripgrep をアンインストールしたい場合:

ripgrepの削除
cargo uninstall ripgrep
bash

Cargoからの出力例:

Removing /Users/username/.cargo/bin/rg
text

.cargo/bin ディレクトリから実行ファイル rg が即座に削除され、管理メタデータが更新されます。

3. 応用コマンドと便利なオプション#

3.1. 特定のバイナリのみを指定して削除 (--bin)#

クレートが複数の実行ファイルをインストールしており、その中の1つだけを削除したい場合は --bin フラグを使用します:

特定バイナリの削除
cargo uninstall <package_name> --bin <binary_name>
bash

例:cargo-update クレートから cargo-install-update-config のみを取り除く場合:

1つのバイナリのみ削除
cargo uninstall cargo-update --bin cargo-install-update-config
bash

3.2. カスタムRootディレクトリからの削除 (--root)#

--root オプションを指定して特定ディレクトリにインストールしていた場合は、アンインストール時にも同じパスを指定します:

カスタムルートからの削除
cargo uninstall --root /custom/path <package_name>
bash

4. 手動での削除 (Manual Removal)#

メタデータファイルが破損している場合や直接ファイルを操作したい場合は、Cargoのバイナリディレクトリから直接削除できます。

デフォルトの保存場所:#

  • macOS / Linux: $HOME/.cargo/bin/ (または ~/.cargo/bin/
  • Windows: %USERPROFILE%\.cargo\bin\ (例:C:\Users\ユーザー名\.cargo\bin\

手動削除コマンド:#

macOS / Linux の場合:

Unixでの手動削除
rm ~/.cargo/bin/rg
bash

Windows (PowerShell) の場合:

Windowsでの手動削除
Remove-Item "$HOME\.cargo\bin\rg.exe"
powershell

[!WARNING] 手動で削除した場合、バイナリ自体は消去されますが、.crates2.json のメタデータ記録に残る場合があります。そのため、メタデータが更新されるまで cargo install --list に表示され続けることがあります。

5. よくあるトラブルシューティング#

トラブル 1: error: no package found with name ...#

バイナリ名とパッケージ(クレート)名を混同している場合に発生します。

  • 誤り: cargo uninstall rg
  • 正しい: cargo uninstall ripgrep

cargo install --list で正確なクレート名を確認してください。

トラブル 2: 削除したはずのコマンドがまだ実行できる#

cargo uninstall 実行後もコマンドが動く場合、以下の原因が考えられます:

  1. シェルのパスクラウドキャッシュ: シェル(Zsh/Bash)がメモリ内に旧パスをキャッシュしています。キャッシュをクリアしてください:
    • Zsh: rehash
    • Bash: hash -r
  2. 他のパッケージマネージャで導入されている: Homebrew (brew)、APT、Scoop等で別途インストールされている可能性があります。以下のコマンドで確認してください:
    バイナリのパス確認
    which <コマンド>
    bash

コマンド一覧表#

操作実行コマンド
インストール済み一覧の確認cargo install --list
パッケージの削除cargo uninstall <package_name>
特定バイナリの個別削除cargo uninstall <package_name> --bin <binary_name>
カスタムパスからの削除cargo uninstall --root <path> <package_name>
バイナリ保存先パス~/.cargo/bin/ (Unix) または %USERPROFILE%\.cargo\bin\ (Windows)

参考文献#