この記事は DENSOアドベントカレンダー2024 の9日目の記事です。
背景
JavaScript界隈ではhusky
を用いてpre-commit
やpre-push
などのGitフックを簡単に設定できます。
これにより、コミットやプッシュ時に自動でテストやリント、
フォーマットチェックを実行する運用が一般的です。
一方、Rustプロジェクトでも同様のことを行いたい場合があります。
ただし、npm
やpython
といった他言語ツールに依存せず、
Cargoエコシステム内で同様のフローを構築したいケースです。
そのような場面で役立つのがcargo-husky
になります。
本記事ではcargo-husky
を使用してRustプロジェクトでGitフックを管理する方法を紹介します。
pre-commit
やpre-push
などのフックで任意コマンドを実行する手順と、
Docker環境下でコンテナ内コマンドを実行する際のポイントを示します。
cargo-husky
とは
cargo-husky
はcargo test
実行時に.git/hooks
配下へフックファイルを自動生成するツールです。
Cargo.toml
のdev-dependencies
にcargo-husky
を追加し、
cargo test
を行うだけでデフォルトでpre-push
フックが設定されます。
インストール例
Cargo.toml
に以下を記述します。
[dev-dependencies]
cargo-husky = "1"
この状態でcargo test
を実行すると、
git push
時にcargo test
が自動的に実行されるpre-push
フックが.git/hooks/pre-push
へ生成されます。
独自コマンドを実行したい場合
標準設定ではpush
時にcargo test
を実行します。
しかし、他のコマンド(ビルドツールやコード整形ツールなど)を使いたい場合や、
pre-commit
フックで独自の処理を行いたい場合もあります。
そのようなときはcargo-husky
が提供するfeatures
フラグやuser-hooks
機能を利用するとよいです。
user-hooks
機能を使ったカスタムフック設定
user-hooks
機能を有効にすると、cargo-husky
が自動生成するフックを抑制できます。
代わりに、.cargo-husky/hooks
ディレクトリへユーザー独自のフックスクリプトを配置して、
任意のコマンドを実行可能になります。
手順:
-
Cargo.toml
を以下のように変更します。[dev-dependencies.cargo-husky] version = "1" default-features = false features = ["user-hooks"]
この設定により、
cargo test
を実行した際に、
デフォルトのpre-push
フック(cargo test
実行)は生成されなくなります。 -
.cargo-husky/hooks
ディレクトリを作成します。mkdir -p .cargo-husky/hooks
-
たとえば
pre-commit
フックで独自コマンドmy_custom_command
を実行したい場合、
以下のようなスクリプトを用意します。echo '#!/bin/sh set -e my_custom_command ' > .cargo-husky/hooks/pre-commit chmod +x .cargo-husky/hooks/pre-commit
-
cargo test
を実行すると、ビルドスクリプトが発動します。
これにより.cargo-husky/hooks
下のスクリプトが.git/hooks/pre-commit
へコピーされます。cargo test
以上でgit commit
時にmy_custom_command
が実行されるようになります。
Docker環境での実行例
Docker環境で開発する場合、フックスクリプト内でdocker compose exec
を利用すると、
コンテナ内で任意のコマンドを実行可能です。
echo '#!/bin/sh
set -e
docker compose exec -T my_container_name my_custom_command
' > .cargo-husky/hooks/pre-commit
chmod +x .cargo-husky/hooks/pre-commit
この設定により、git commit
時にコンテナ内でmy_custom_command
が実行されます。
これによって外部ツールへの依存を減らし、
統合的なワークフローを実現できます。
よくある質問
git push
時にcargo test --all
が実行される理由
cargo-husky
は標準でpre-push
フックを生成し、cargo test
を実行します。
別のコマンドを利用したい場合はdefault-features = false
を指定し、user-hooks
機能を有効化してください。
これで独自のフックが定義できるようになります。
package.metadata.husky.hooks
は使えるか
cargo-husky
はnpm
版husky
とは異なる仕組みで動作します。
package.metadata.husky.hooks
はサポートされていません。
代わりに[dev-dependencies.cargo-husky]
やuser-hooks
ディレクトリを用いてカスタマイズします。
まとめ
-
cargo-husky
によりRustプロジェクトのGitフック管理が容易になります。 -
user-hooks
機能を使うことで任意コマンドやコンテナ内コマンドの実行が可能です。 -
npm
やpython
に依存しないCargoネイティブなフック管理により、開発効率が向上します。