Rustエンジニアの救世主:justfileによる開発プロセス自動化の極意
免責事項: このブログは「ChatGPT/Vertex AI/Claude API」によって生成されたものです。
こんにちは、Rustエンジニアの皆さん!今回は、ソフトウェア開発における生産性を劇的に向上させる強力なツール「Justfile」をご紹介します。Justfileは、そのシンプルさと柔軟性から注目を浴びており、特にMakefileが難解に感じる方々にとっての理想的な代替手段となります。
Justfileとは?
Justfileは指示通りにコマンドを実行するためのテキストファイルで、「just」と呼ばれるコマンドランナーと共に使います。これにより、プロジェクトの様々なタスクを簡単に管理・実行することが可能です。
Justfileのインストール
まずは「just」をインストールしましょう。Homebrewを使えば非常に簡単です。
brew install just
その他のOSについては、公式ドキュメントを参照してください。
Justfileの基本構造
Justfileはシンプルな文法を持っています。以下は基本的な構造です。
# コメントはシャープ記号で始まります
# タスクの定義
hello:
echo "Hello, World!"
この例では、「hello」というタスクが定義されており、「just hello」というコマンドで実行できます。
実際の使い方
実際にJustfileを使ってみましょう。以下にデモプロジェクトのためのJustfileを作成します。
# データベースの起動
db-start:
docker-compose up -d db
# アプリケーションの起動
app-start:
cargo run
# 全体のセットアップ
setup:
just db-start
just app-start
このJustfileをプロジェクトのルートディレクトリに配置すると、「just setup」というコマンド一つでデータベースとアプリケーションをセットアップできます。
便利なTips
引数の使用
Justfileでは引数を使うこともできます。
greet name:
echo "Hello, {{name}}!"
実行時には以下のように引数を渡します。
just greet Alice
デフォルトタスク
特定のタスクをデフォルトに設定することも可能です。
default:
echo "This is the default task"
この場合、「just」とだけタイプするとデフォルトのタスクが実行されます。
Rustエンジニア向けJustfileの詳細
続いて、Rustプロジェクト向けの高度なJustfile例を見てみましょう。
環境設定
set shell := ["fish", "-c"]
set dotenv-load := false
この設定では、シェルとしてfishを使用し、.envファイルの自動読み込みを無効にしています。
共通変数の定義
application_name := "mysql_application_rust"
server_name := "myserver"
remote_path := "/var/wrust/wmyapplication"
uname := `uname`
hostname := `hostname`
pwd := `pwd`
pgm_version := `head -n 5 Cargo.toml | grep '^version'`
date_time := `date`
これらの変数は、後続のコマンドで使用される共通の値を定義しています。
クロスコンパイルとデプロイメント
cross-compile:
# クロスコンパイルのコマンド
#!/usr/bin/env fish
if test "{{uname}}" = "Darwin"
cargo zigbuild --release --target x86_64-unknown-linux-gnu
else
sd 'openssl' '#openssl' Cargo.toml
cargo build --release
sd '#openssl' 'openssl' Cargo.toml
end
_compiled_from:
# コンパイル情報の記録
@echo "Compiled from {{uname}} - {{hostname}}:/{{pwd}}" > xVersion_Info
@echo "{{pgm_version}}" >> xVersion_Info
@echo "{{date_time}}" >> xVersion_Info
deploy-to-server target="myapp_dev1":
# デプロイのコマンド
#!/usr/bin/env fish
just cross-compile
just _compiled_from
set target_file "{{remote_path}}/{{target}}/{{application_name}}"
if test "{{uname}}" = "Darwin"
rsync -av -e ssh target/x86_64-unknown-linux-gnu/release/{{application_name}} user_name@{{server_name}}:$target_file
else
rsync -av -e ssh target/release/{{application_name}} user_name@{{server_name}}:$target_file
end
rsync -av -e ssh xVersion_Info user_name@{{server_name}}:{{remote_path}}/{{target}}/
ssh -t user_name@{{server_name}} "sudo systemctl restart rust_{{target}}.service"
これらのコマンドにより、MacOSとLinux両方に対応したクロスコンパイルとデプロイメントが可能になります。
ローカル開発支援
cargo-watch:
WMYAPP_RUST_PORT=4022 cargo watch --clear --exec 'run --release'
cargo-run:
WMYAPP_RUST_PORT=4022 cargo run --release
cargo-watch
は、ファイルの変更を監視して自動的にコンパイルと実行を行います。cargo-run
は、単純にプロジェクトをコンパイルして実行します。
Cargo関連のコマンド
cargo-outdated:
cargo outdated --root-deps-only
cargo-update:
cargo update
cargo-clean:
cargo clean
cargo-clippy:
cargo clippy --release
cargo-bump:
cargo bump minor
これらのコマンドで、依存関係の管理、プロジェクトのクリーンアップ、リントチェック、バージョン管理が簡単に行えます。
Rustup関連のコマンド
rustup-update:
rustup update
rustup-show:
rustup show
Rustのツールチェーンの更新と現在の設定の確認が行えます。
その他のユーティリティ
[macos]
git-browse:
git-browse
_cargo-common-installs:
# 共通のCargo installsコマンド
cargo install cargo-outdated cargo-update cargo-bump sd
cargo-installs:
# Cargoユーティリティのインストール
#!/usr/bin/env fish
if test "{{uname}}" = "Darwin"
rustup target add x86_64-unknown-linux-gnu
cargo install cargo-zigbuild
end
just _cargo-common-installs
これらのコマンドは、GitHubページを開いたり、必要なCargoユーティリティをインストールしたりするのに役立ちます。
まとめ
Justfileを使うことで、プロジェクト内の反復作業が大幅に効率化されます。特に以下の点が素晴らしいです:
- 環境に応じた柔軟なコマンド実行
- デプロイメントの自動化
- 開発効率を上げるwatchコマンド
- 一般的なCargoタスクの簡略化
- Rust環境の管理
まずは基本を押さえ、自分のプロジェクトに合わせたカスタマイズを行ってみてください。きっと開発生産性が大幅に向上するはずです。
Ref:
https://just.systems/man/en/ (Justマニュアル)
https://github.com/sigoden/aichat (AIChat: All-in-one AI CLI Tool)
https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude (Vertex AI / Claude API)
Discussion