🦀

100日後にRustをちょっと知ってる人になる: [Day 71]依存関係管理: cargo-outdated

2022/11/26に公開

Day 71 のテーマ

Day 70 で、Cargo.toml を編集して依存関係を管理する cargo-edit の使い方を見てみました。以下のような cargo のサブコマンドが追加されて、依存関係の管理・編集を行うことができました。

  • cargo add
  • cargo rm
  • cargo upgrade
  • cargo set-version

ところで、cargo upgrade を使って依存関係のバージョンを最新化することができましたが、現在使っている依存関係が古くなっているかどうか調べるにはどうしたらいいでしょうか。
そのような時に役立ちそうなのが、cargo-outdated です。

cargo-outdated

cargo-outdatedは、依存関係に新しいバージョンがある場合に表示するためのものです。

Cargo.toml でのバージョン指定は、SemVer (セマンティックバージョニング) です。この指定するバージョンですが、npm のバージョン記述で使用する ^(キャレット)と同じ様に扱われます。つまり、以下のようにバージョンが 0.1.0 と指定されている場合は、範囲としては 0.1.0 以上、0.2.0 未満となり、この範囲で新しいバージョンになっていれば、cargo update で最新バージョンが洗濯されます。

[dependencies]
toml = "0.1.0"

しかし、0.2.0 よりも新しいバージョンが出ている場合だと検索にひっかからずに最新の依存関係へのアップデートが行われません。
そこで、cargo outdated を実行することで新しいバージョンが公開されているかどうかを確認することが可能になります。

インストール

以下のコマンドでインストールを行います。

cargo install --locked cargo-outdated

しばらくすると、outdated サブコマンドが追加されています。

$ cargo --list

Installed Commands:
    add                  Add dependencies to a Cargo.toml manifest file
    b                    alias: build
    bench                Execute all benchmarks of a local package
    :
    outdated
    :

動作確認

以下のように古いバージョンをしていた依存関係を追加してみます。

[package]
name = "day_71_cargo-outdated"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
clap = "1.0.0"

ちなみに、この clap は、今日時点で最新バージョンは 4.0.27 です。

では、実行をおこなってみます。

$ cargo outdated

Name             Project  Compat  Latest   Kind    Platform
----             -------  ------  ------   ----    --------
clap             1.3.2    ---     4.0.27   Normal  ---
clap->ansi_term  0.6.3    ---     Removed  Normal  ---
clap->strsim     0.4.1    ---     0.10.0   Normal  ---

最新バージョンについて表示がおこなれました。これを参考にバージョン指定をすることができそうですよね。

Day 71 のまとめ

cargo upgrade コマンドにより毎回依存関係のメンテナスをし続けていれば、依存関係の対応バージョンの整合性が合わなくなることはなと思います。とはいえ、毎回アップグレードし続けるのも難しい場合はあると重いmす。例えば、GitHub リポジトリを git clone してくるような場合だと、たしかに古いバージョンになっていると思います。
そのような時に、この git outdated を実行して依存関係の最新バージョンの確認をしてみるのは望ましいのではないかなって思いました。

GitHubで編集を提案

Discussion