MENU

Taskfileとは|2017年公開のGo製Make代替タスクランナー

Taskfile アイキャッチ
Taskfile

Taskfileは2017年にブラジルの開発者Andrey Nering氏が公開した、Go言語製のタスクランナーgo-taskが読み込むYAML形式の定義ファイルである。GNU Makeの後継的存在を狙って設計され、依存関係の表現、ファイル変更検知による再実行、変数展開といったMakeの主要機能をYAMLで明示的に書ける。Windowsでも追加ツールなしに動くクロスプラットフォーム性が支持され、Makefileの代替として採用するOSSプロジェクトが急増した。

目次

この記事の目次

  1. Makeでは辛い場面と発想の出発点
  2. Taskfile.ymlの基本構造
  3. 差分実行とジョブの依存解決
  4. Windows対応とエコシステム
  5. まとめ

Makeでは辛い場面と発想の出発点

Makeでは辛い場面と発想の出発点

GNU Makeはタブとスペースの区別、シェル毎の改行扱い、Windowsでの非互換など、現代のクロスプラットフォーム開発で多くの摩擦を生んできた。Docker Composeのようなツールが普及しdocker compose upを始めとする雑多なコマンドを束ねる需要が高まる中、もっと素直に書けるタスクランナーが求められていた。

Andrey Nering氏は2017年にこの不満に応える形でgo-taskをGitHubに公開した。Goの単一バイナリで配布されmacOS/Linux/Windowsで等しく動く点、設定ファイルがYAMLで読み書きしやすい点が初期から好評で、Kubernetes関連プロジェクトを中心に採用が広がった。2020年代には公式マイクロサービスのテンプレートやBOSHのツールチェーンでも採用例がみられる。

Taskfile.ymlの基本構造

Taskfile.ymlの基本構造

ファイル名はTaskfile.yml(またはTaskfile.yaml)で、ルートにversion: '3'tasks:セクションを置く。tasks: build: cmds: ["go build ./..."]のようにコマンド配列を並べる素直な記法で、task buildを実行すると配下のcmdsが順番に実行される。依存関係はdeps配列で記述し、複数タスクを並列実行する場合の指定も明示的に書ける。

変数はvarsセクションでデフォルト値を定義し、コマンドラインからtask build VERSION=1.2.3の形で上書きできる。Goテンプレート構文がそのまま使え、{{.VERSION}}のような展開や{{if eq .OS "windows"}}のような条件分岐がYAMLの値の中で書ける。Makefileの暗黙的なルールに比べ、振る舞いを明示する設計思想が強い。

差分実行とジョブの依存解決

差分実行とジョブの依存解決

Makeのターゲット概念に相当するsourcesgeneratesをタスクに記述すると、ファイルのmtimeやハッシュを記録して未変更時の実行をスキップできる。method: checksumを指定すればmtimeに依存せずSHA256で判定するため、CIのキャッシュ環境でも誤判定が起きにくい。Makeの.PHONYとの混乱がなく、何が成果物で何がコマンドかを宣言的に書ける点が強みである。

justやmise tasksと比較すると、Taskfileは中規模以上のプロジェクトで依存ツリーが複雑になっても破綻しにくい。include:で他のYAMLを読み込むサブモジュール機能、internal: trueで外部から呼べない補助タスクを定義する機能など、長年の運用ノウハウが詰まっている。設定ファイルが膨れがちなのは正直なところ難点だが、その分挙動の予測可能性は高い。

Windows対応とエコシステム

Windows対応とエコシステム

go-taskはWindowsでも追加のシェル(MSYS等)無しに動作する。mvdan/shという純GoのPOSIX shエンジンを内蔵しているため、Taskfile.ymlに書いたshell構文がWindowsのcmd.exeに依存せず実行される。task setup一発でWindowsとmacOSの差を吸収できるのは、新規メンバーが多くOSが入り混じるチームで非常に大きな利点である。

VSCodeにはTaskfile拡張機能があり、YAMLスキーマによる補完やリンタが効く。シェル補完もzsh/bash/fish向けに公式生成スクリプトが用意され、task でタスク一覧が表示される。Goプロジェクトを中心に採用が広く、KubernetesのCNCFプロジェクトやDevOps系のOSSでもMakefileの代替として定着しつつある。

まとめ

Taskfileは2017年に登場したGo製のタスクランナーで、Makefileの後継として明示的・宣言的・クロスプラットフォームを軸に据えた。差分実行や依存解決、Windowsでの素直な動作など現代の開発に必要な要素が揃っており、規模が大きくなっても破綻しにくい安定した選択肢として中堅以上のプロジェクトで重宝されている。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次