🏃

モダンなタスクランナーを求めて task (taskfile.dev) を使うまでの軌跡

2024/05/30に公開

tl;dr

  • GNU Make に代わるタスクランナーが欲しいなって
  • 条件を整理
  • ひとまず Task にした

はじまり

  • 以前からタスクランナーとして GNU Make を使っていた
  • alias m="make"
  • ルーチンワークはだいたい m xx で片付けていた。正直便利ではあった
  • 複数のタスクをまとめて実行した時に、エラー箇所とその続きを処理しなければならない時に手間がかかることがあった(書き方の問題)
  • 説明や階層などの作りのルールが暗黙過ぎて、育てれば育てるほど可読性が落ちた(だから書き方の問題)
  • そもそも make はビルドツールで、タスクランナーじゃない(考え方の問題)
  • ぶっちゃけワンライナーを積み上げる使い方をしているので、alias 化でも問題ない使い方をしている
  • Windows 11 + WSL2 + Ubuntu 20.04 -> Ubuntu 24.04 に移行するのを機に、タスクランナーも移行しようと考えた
  • せっかくだからモダンなランナーがいいよね

条件

要件を検討

  • 個人で使うけど使えるならチームにも展開したい
  • モダンであること(後発であって先人のツールを超える何かであること)
  • 運用時に必要なものが増えたり手間がかかるものは避けたい
  • 特定の要件に寄ったものは避けたい
  • サーバ化は必要としていない(HashiCorp WayPointは違うということ)
  • ローカルでも(CI/CDなどの)サーバでも使いやすいとうれしい → ワークフロー的なものにできるといい
  • 更新が半年以上停滞しているものは避けたい(それはすでにモダンとは言わない)

この時点で除外されるもの

  • Grunt 等の JS を必要とするビルダーは全部落選(JSのビルドは要件外なのと、それらをラップするランナーが欲しいので)
  • Apache 系ビルドツールは落選(モダンじゃないってゆうか Maven とか使うなら GNU Make でいいでしょって)
  • Waypoint by HashiCorp(リリース当時は良さげに見えたけどね。ローカルサーバは今回必要としてない)
  • babashka(bb ってコマンド名はタイプしやすくて良さげだけど)
  • Hardhat(JS系だし Ethereum に寄りたいわけでもないので)
  • Buffalo(開発停止したっぽい?あと日本ではググラビリティが悪そうw)
  • realize(Go 用だし?)

こうであって欲しいもの

  • 現時点で半年以内に更新のあるもの(継続した更新が行われているもの)
  • できる限り OS を超えて問題ないもの(少なくても Mac と Linux で動くもの。最悪 Windows は動かなくてもいい。WSL 使えばいいので)
  • ワンバイナリが望ましい(導入負荷のないものが望ましい → Go や Rust 製に縛られる?)
  • YAML かそれに準じる書式であるもの(手抜きをしても可読性が保ちやすいもの)
  • ロジックな部分は強く求めない。宣言的な可読性を優先したい

あると嬉しい機能

  • サブディレクトリ以下でも遡って設定を読み込める(makeにはない)
  • 引数を渡せる(makeでは擬似的な工夫で処理する)
  • テンプレート(Go系のツールだと go-template を食ってるものが多い)
  • インクルード(別ファイルを読み込める)
  • 設定ファイルのヒエラルキー(プロジェクト用と個人用を別に管理できる)
  • env の読み込み

候補

  • GitHub は こんな感じ で検索した
  • 国外の OSS 比較サイトやツールの紹介ブログ等を使って探した
  • 正直腐るほどあるので、全部は見ていない

条件を踏まえてあれこれ見て回った結果、次の候補が残った。

ググラビリティの悪いツールが多い(そりゃ同じような名前がつくよね)ので、しっかり確認できたとは言わない。
が、検討していた内容を踏まえると、これ以上は今のところ見つからなさそう。

比較

共通

  • Go 製である(ワンバイナリ)
  • 年単位で開発されており、現在も更新されている
  • サブディレクトリ以下でも呼べる(内部タスクの実行時のディレクトリの解釈は異なるみたい)

cmdx の良さそうなところ

  • aquaproj/aqua の作者さんなので使い勝手が似てる(ように見える)
  • 日本語で問い合わせができるw
  • タイムアウトが設定できる(go-task は引数で指定しかできないっぽい?)

go-task の良さそうなところ

今回は go-task/task を選択

  • 普段から aqua を使っている ので、揃えで cmdx って目もあったんだけど、揃えない(ロックインしない)も正だと思った
  • ぶっちゃけタスクランナーならいつでも入れ替えできる
  • go-task のほうが人数差もあってドキュメントや機能が充実しているように見えた

というわけで今回は go-task/task を選択することにした。

最後に

  • 星取表を簡単に作れるツールとか欲しいな
  • メリデメの整理方法をもうちょっと勉強するべき
  • 英語表現を勉強するべき(ディレクトリを遡って設定ファイルを探す機能って正式名称あるのかしら?最初ディレクトリトラバーサルかなとか思っていたw)
  • ツールの良し悪しは使ってみないとわからないけど、使うと使い方の問題なんじゃないかって疑心暗鬼が出たりして、収拾ががつかなくなるので今回は使う前に記事を書いた
  • しばらく使ったら使用感の記事がかけるという一石二鳥w

Discussion