Open2

Rustで利用していないdependenciesを見つける

yunayuna

rustのモジュール構築後、テンプレートからモジュール構築した場合や、
利用crateが変更になったりしたときに、リファクタリングを行って不要なdependenciesを削除したい事があります。

Cargo.tomlから、dependenciesに記述されているcrate(モジュール)を削除してcargo checkをすれば、
うっかり使っていたものが削除された場合はコンパイルエラーになるので気づくことはできますが、
一つ一つチェックしていくのは面倒。

ということで、自動的に不要なdependenciesを見つけてくれるcargo-udeps というモジュールがあります。
https://github.com/est31/cargo-udeps

これを使ってリファクタリングをした時のメモ。

yunayuna

install

最新リリースをインストールする場合

基本はこちら

cargo install cargo-udeps --locked

git repositoryのmasterからインストールする場合

※リリースされていない最新機能が必要な場合はこっち

cargo install --git https://github.com/est31/cargo-udeps --locked

注意事項

以下について、非検出になるcrateが存在します。
とは言え、安全側に倒れるので、このツールで検出後、さらに減らしたい場合は、手動でdependenciesの削除を行っていけばOKです。

  • いくつかの未使用クレートは検出されない可能性が有ります。
    stdとその依存関係によって使用されるクレート、および対象のクレートの依存関係によってすでに使用されているクレートなど
  • クレートは名前単位でのみチェックされており、同じ名前でバージョンが異なる2つのクレートについてはチェックされない

事前設定

cargo-udepsで、チェック対象外にしたいdependenciesがある場合、
Cargo.tomlに記述することで対象外にできます。

if_chain crateを、チェック対象外にする(コード内で利用されていなくても、残す)

[package.metadata.cargo-udeps.ignore]
normal = ["if_chain"]
#development = []
#build = []

[dependencies]
if_chain = "1.0.0" 

コマンド

以下を実行します(2024/1/29 時点(v0.1.45))

#rustのnighly versionが必要なので事前にインストール
rustup install nightly
#実行
cargo +nightly udeps

#結果
nused dependencies:
`sample_project v0.2.1 (/home/user/Project/sample_project)`
└─── dependencies
     ├─── "attohttpc"
     ├─── "eframe"
     ├─── "egui"
     ├─── "futures"
     ├─── "launchd"
     ├─── "sled"
     └─── "systemctl"
Note: These dependencies might be used by other targets.
      To find dependencies that are not used by any target, enable `--all-targets`.
Note: They might be false-positive.
      For example, `cargo-udeps` cannot detect usage of crates that are only used in doc-tests.
      To ignore some dependencies, write `package.metadata.cargo-udeps.ignore` in Cargo.toml.

上記出力結果で、

他のtargetsで使われている可能性があるので、もしどのtargetでも使ってないものだけを抽出したい場合は、
--all-targetsをつけて実行してください、
とのことなので、--all-targetsをつけて実行してみた

cargo +nightly udeps --all-targets

unused dependencies:
`sample_project v0.2.1 (/home/user/Project/sample_project)`
└─── dependencies
     ├─── "attohttpc"
     ├─── "eframe"
     ├─── "egui"
     ├─── "futures"
     ├─── "launchd"
     └─── "sled"
Note: They might be false-positive.
      For example, `cargo-udeps` cannot detect usage of crates that are only used in doc-tests.
      To ignore some dependencies, write `package.metadata.cargo-udeps.ignore` in Cargo.toml.

結果、一部のdependenciesは検出結果から外れた。