Rustのプロジェクトを一括でcleanするツールを作った

Rustのパッケージ管理ツールCargoのプラグインとして、指定ディレクトリ以下の全てのプロジェクトを探して cargo clean するツール、 cargo-clean-recursiveと作成したという話。

動機

CargoはRustの標準のパッケージ管理ツール兼ビルドツールであり、RubyにおけるRubyGemsJavaScript系言語におけるnpmと同等の機能を提供するツールである。

Cargoでは、依存するクレート(Cargoおけるパッケージ)については共通のディレクト~/.cargo/registry に、コンパイル後のバイナリや生成したドキュメントについてはプロジェクトのディレクトリ下の target ディレクトリに保存している。 これは、クレートがソースコードの形態で配布され変化することがない一方で、コンパイル後のバイナリやドキュメントはビルド時のフラグや環境変数によって変化するためである。 したがって、ビルド結果として生成されるファイルは、依存クレートのものを含めプロジェクトごとに管理する必要がある。 そして、このバイナリファイルやドキュメントはファイル数が多く、ディスク容量を消費する。 サンプルとして、自作のAWS S3とCloudFrontへの静的ホームページの同期ツールをビルドしてみると、合計で200の依存クレートが存在した。 デバッグビルド・リリースビルド・ドキュメントを合わせると消費しているディスク容量は2.09 GiB、ファイル数は81496個であった。

ビルド結果のファイルは再生成できるものであり、長期間使わないなら削除しておきたい。 しかし、標準の cargo のコマンドでは指定ディレクトリ以下の全てのプロジェクトを一括でcleanする方法がないため、サブコマンドとして実装した。

使用法

このツールをインストールするには、 cargo install cargo-clean-recursive を実行すれば良い。

  • cargo clean-recursive を実行すると、カレントディレクトリ以下の全てのプロジェクトを探し、 cargo clean を呼び出す。
  • cargo clean-recursive --release の場合、 cargo clean --release を呼び出し、リリースビルドの出力のみを削除する。
  • cargo clean-recursive --doc の場合、 cargo clean --doc を呼び出し、リリースビルドの出力のみを削除する。

同時に --doc (-d) と --release (-r) を指定することもできる。 この場合、 cargo clean --releasecargo clean --doc をそれぞれ呼び出している。