🤖
Justfileで並行実行されたタスクに色付きのマーカを付ける
概要
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