🤖

Justfileで並行実行されたタスクに色付きのマーカを付ける

2025/03/12に公開

概要

JustはRust製のタスクランナです。justfileにシンプルな記法でタスクを設定できます。ところが、現在並列実行に関しては公式的には提案中のようです。ただjustは内部でシェルスクリプトが動くので、一般的なコマンドを活用して並列実行、そしてログ出力時のマーカを設定してみました。

結構力業ですが、だいぶ見やすいです。

使用画像

DISCLAIMER

  • concurrently とか使えば? => ビルド済みの環境でnodeを入れたくなかったんですよね
  • makeで良くない? => makeでもいいです。

手法

並列実行について

https://qiita.com/suin/items/62337b8df9fa7c1edb7f の記事を参考にさせていただきました。bash環境でのバックグラウンドタスクとkillを活用しているようです。

マーカーについて

stdbufコマンドとsedコマンドを使います。これらは一般的な Unix 系環境には入っているかなと思います。
簡単にコマンドを解説しておくと、stdbufは標準入出力ストリームのバッファ動作を変更してコマンドを実行するもので、sedは文字列を置換したり、今回の例ではつけ足したりするコマンドです。

コード例

# バックエンドのディレクトリ
BACKEND_DIR := 'backend'

# フロントエンドのディレクトリ
FRONTEND_DIR := 'frontend'

# バックエンドの起動(ララベルのイメージ)
backend:
    cd {{BACKEND_DIR}} && php artisan serve

# フロントエンドの起動(node系のフレームワークのイメージ)
frontend:
    cd {{FRONTEND_DIR}} && pnpm run dev

# バックエンドとフロントエンドの同時起動
# stdbufを用いてログ出力を補足し、sedコマンドへ受け渡す。
# sedコマンドではログの先頭に色付きのマーカを付け足している。
# カラーコード記法例: \033[32m は緑、[34m は青、最後に \033[0m で色をリセット。
all:   
    #!/bin/bash -eu
    (stdbuf -oL just backend | sed "s/^/$(printf '\033[32m[BACKEND]\033[0m ')/") &
    (stdbuf -oL just frontend | sed "s/^/$(printf '\033[34m[FRONTEND]\033[0m ')/") &
    trap 'kill $(jobs -pr)' EXIT
    wait

Discussion