?「プロジェクトでよく使うコマンド Makefile に書いたろー」
?「docker compose up -d --wait
っと…」
👮♀「 Makefile警察 だ!」
👮♀「 Makefile は、ソフトウェアのビルドプロセスを自動化するためのファイルだ!」
👮♀「多目的なタスクランナーとして使うな!」
?「せやったんか。誠にごめんなさい。」
Makefile は広く使われていますが、時々目的外に使われてしまうことがあります。しかし、そのような使い方にはより適した代替手段が存在します。この記事では、 Taskfile というツールについて解説します。
Makefile のつらみ
Makefile は主にビルドプロセスを自動化する目的で生まれましたが、様々なコマンドをまとめて実行する便利さから多目的なタスクランナーとしてもよく使われます。しかし、次のような問題があります。
- シンタックスが独特で学習コストが高い
- 複雑ことをやろうとすると可読性が下がりがち
- 時折 Makefile警察 が現れる
これらの点から、 Makefile の代わりになるものを探る価値があります。
Taskfile の紹介
Taskfile は、シンプルで柔軟なタスクランナーです。 YAML 形式でタスクを定義することができます。
Go で作られており、バイナリ単体で動作するため、多くのプラットフォームで簡単に導入できます。
Makefile と比べたメリット
メリット
- シンタックスが YAML で分かりやすい
- Makefile より機能が豊富で大抵のことはシンプルに書ける
- Taskfile はタスクランナーなので Makefile警察 を黙らせられる
書き方
Taskfile.yml
ファイルをプロジェクトのルートに作成して、タスクを定義します。
例:
version: '3'
tasks:
hello:
desc: "This task says Hello, World!"
cmds:
- echo "Hello, World!"
上記の例では、hello
という名前のタスクを作成しています。このタスクは単純に "Hello, World!" を出力します。
タスクを実行するには、以下のコマンドを使用します。
> task hello
task: [hello] echo "Hello, World!"
Hello, World!
定義してあるタスクの一覧を表示することもできます
> task --list
task: Available tasks for this project:
* hello: This task says Hello, World!
依存するタスクを並列で実行したり、カレントディレクトリに Taskfile.yml
がない場合、親ディレクトリを辿って探してくれたり他にも便利な機能がいっぱいあります
まとめ
Makefile は強力なツールですが、多目的なタスクランナーとして使用する場合には独特のシンタックスや制約がハードルとなることがあります。 Taskfile は YAML をベースにシンプルかつ柔軟なタスクの定義が可能です。プロジェクトの自動化には、適切なツールを選択しましょう。