とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

makeを卒業してjustに乗り換えてみよう

プロジェクトで「よく使うコマンドをまとめておく場所」としてMakefileを使っていること結構ありますよね。make testmake buildmake deploy...コマンドを統一できて便利なのですが、Makefileには落とし穴があります。

インデントは必ずタブ文字でないといけない(スペースだとエラー)、ターゲット名がファイル名と衝突するので.PHONYが必要、変数の扱いが独特...。本来makeはビルドシステムとして作られたツールなので、コマンドランナーとして使うには色々と不便な部分があります。

「コマンドをまとめて実行できればいい。ビルドシステムの機能は要らない」という用途にぴったりなのがjustです。

just

github.com

justは、プロジェクト固有のコマンドをjustfileに書いておき、簡単に実行できるコマンドランナーです。Rustで実装されており、GitHub Stars 33,000超で結構人気みたいですね。知りませんでした。makeの「コマンドランナーとして使いたい」という部分だけを取り出して、シンプルにしたのがjustです。

justの特徴

1. Makefileの面倒がない

.PHONYは不要でタブのインデント強制もありません。ただレシピを書くだけで動きます。

# Makefileのように書けるが、もっとシンプル
test:
  cargo test

build:
  cargo build --release

deploy: build
  ./deploy.sh

.PHONY: test build deploy

makeで必要だった.PHONY: test build deployのような記述は一切不要です。

2. 引数を自然に渡せる

レシピにパラメータを定義でき、コマンドライン引数として渡せます。

# 引数付きレシピ
build target="debug":
  cargo build {{if target == "release" { "--release" } else { "" }}}

# デフォルト値あり・なし両方定義できる
deploy env tag="latest":
  kubectl set image deployment/app app=myimage:{{tag}} -n {{env}}
just build            # target="debug" で実行
just build release    # target="release" で実行
just deploy staging
just deploy production v1.2.3

makeで引数を渡すにはmake build TARGET=releaseのように書く必要がありますが、justはより直感的です。

3. .envファイルと統合できる

set dotenv-loadを書いておくだけで、.envファイルの内容を自動で読み込んでくれます。

set dotenv-load

# .envに DATABASE_URL=postgres://... と書いておけば
migrate:
  diesel migration run --database-url $DATABASE_URL

開発環境の設定をそのまま使えるので、環境変数の取り回しが楽になります。

4. 誤操作を防ぐ[confirm]属性

危険なコマンドには[confirm]をつけておくと、実行前に確認を求めてくれます。

[confirm("本当に本番環境にデプロイしますか?")]
deploy-prod:
  ./deploy.sh production
$ just deploy-prod
本当に本番環境にデプロイしますか? [y/N]

うっかりミスを防ぐのに便利です。

5. レシピ一覧を表示できる

just --list
Available recipes:
    build [target="debug"] # アプリをビルド
    clean                  # 生成ファイルを削除
    deploy env tag="latest" # デプロイ
    test                   # テストを実行

justをコマンドランナーとして使うとき、チームメンバーが「何を実行できるか」すぐ確認できます。デフォルトレシピをjust --listにしておくと、引数なしでjustを実行したときに一覧が出て便利です。

default:
  @just --list

インストール方法

macOSの場合:

brew install just

Linux(Ubuntu/Debian)の場合:

apt install just

その他のOSや、GitHub Actionsでの使い方については公式リポジトリを参照してください。

基本的な使い方

プロジェクトのルートディレクトリにjustfileを作成して、レシピを書いていきます。

# justfile

set dotenv-load

# デフォルト: レシピ一覧を表示
default:
  @just --list

# 依存関係のインストール
setup:
  npm install
  cargo fetch

# テスト実行
test:
  cargo test
  npm test

# ビルド
build:
  cargo build --release
  npm run build

# 開発サーバー起動
dev:
  docker compose up -d
  npm run dev

# 後片付け
clean:
  cargo clean
  rm -rf dist/ node_modules/
  docker compose down -v

あとは実行したいレシピ名を指定するだけです。

just setup    # セットアップ
just test     # テスト
just build    # ビルド
just dev      # 開発サーバー起動
just clean    # クリーンアップ

まとめ

justは、makeをコマンドランナーとして使いたいときの不便さを解消するツールです。.PHONY不要、タブ強制なし、引数が自然に渡せる、.envファイルと統合できる。「コマンドをまとめて管理したい」という用途にシンプルにフィットします。

既存のMakefileをコマンドランナーとして使っているプロジェクトであれば、justfileへの移行は比較的簡単な気がします。まずよく使うコマンドから移してみるといいでしょう。