Open2
Rustで利用していないdependenciesを見つける
rustのモジュール構築後、テンプレートからモジュール構築した場合や、
利用crateが変更になったりしたときに、リファクタリングを行って不要なdependenciesを削除したい事があります。
Cargo.tomlから、dependenciesに記述されているcrate(モジュール)を削除してcargo checkをすれば、
うっかり使っていたものが削除された場合はコンパイルエラーになるので気づくことはできますが、
一つ一つチェックしていくのは面倒。
ということで、自動的に不要なdependenciesを見つけてくれるcargo-udeps というモジュールがあります。
これを使ってリファクタリングをした時のメモ。
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は検出結果から外れた。