🧠

Rustエンジニアの救世主:justfileによる開発プロセス自動化の極意

2024/08/30に公開

免責事項: このブログは「ChatGPT/Vertex AI/Claude API」によって生成されたものです。

こんにちは、Rustエンジニアの皆さん!今回は、ソフトウェア開発における生産性を劇的に向上させる強力なツール「Justfile」をご紹介します。Justfileは、そのシンプルさと柔軟性から注目を浴びており、特にMakefileが難解に感じる方々にとっての理想的な代替手段となります。

Justfileとは?

Justfileは指示通りにコマンドを実行するためのテキストファイルで、「just」と呼ばれるコマンドランナーと共に使います。これにより、プロジェクトの様々なタスクを簡単に管理・実行することが可能です。

Justfileのインストール

まずは「just」をインストールしましょう。Homebrewを使えば非常に簡単です。

brew install just

その他のOSについては、公式ドキュメントを参照してください。
https://just.systems/man/en/chapter_4.html

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を使うことで、プロジェクト内の反復作業が大幅に効率化されます。特に以下の点が素晴らしいです:

  1. 環境に応じた柔軟なコマンド実行
  2. デプロイメントの自動化
  3. 開発効率を上げるwatchコマンド
  4. 一般的なCargoタスクの簡略化
  5. 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)

CareNet Engineers

Discussion