TaskfileとMakefileの違い
Taskfile とは
シンプルで読みやすい、使いやすいタスクランナーです。
Makefileに比べて可読性が高くクロスプラットフォーム対応、依存管理、並列実行が簡単にできます。
この記事ではMakefileと比べてどういう違いがあるのかを知っていただければと思います。
比較
1. 可読性・記述性の向上
Makefileはタブの使用が必須であったり、ルールの記述が複雑になりがちですが、Taskfile は YAML 形式で直感的に書ける ため読みやすいです。
Makefileとの違い
Makefile の場合
.PHONY: build run clean
PROJECT_NAME=project
build:
@echo "Building $(PROJECT_NAME)..."
gcc main.c -o $(PROJECT_NAME)
run:
@echo "Running project..."
./main
clean:
@echo "Cleaning up..."
rm -f main
- タブを必ず使わないといけない
-
@
をつけないとコマンドが表示される - 変数の扱いが
$()
Taskfile の場合
version: '3'
vars:
PROJECT_NAME: project
tasks:
build:
desc: "Build the project"
cmds:
- echo "Building {{.PROJECT_NAME}}..."
- gcc main.c -o {{.PROJECT_NAME}}
run:
desc: "Run the project"
cmds:
- echo "Running project..."
- ./main
clean:
desc: "Clean up build files"
cmds:
- echo "Cleaning up..."
- rm -f main
- YAML形式で書ける
-
desc
でタスク説明を書ける (task --list
でコマンドの一覧表示ができる) - コマンドの先頭に - をつけることでエラーを無視できる(rm -f はエラー無視だが、他のコマンドでも可能)
descにコマンドの説明を書く。ということが一目でわかることが個人的に好きです。
Makefileはコメントを書くということを意識しないといけないと書き忘れます...
2. クロスプラットフォーム対応
Taskfile は Windows/macOS/Linux で動作 し、GNU Make のような追加インストールが不要
Windows で Makefile を動かす場合は MSYS2/Cygwin などの環境構築 が必要になりますが、Taskfile はそのまま動作します。
OSごとの影響
OS |
make のデフォルト状態 |
インストールの手間 |
---|---|---|
Linux(Ubuntu / Debian) | 標準でインストール済み | 不要 |
Linux(CentOS / RHEL) | インストールが必要 |
sudo yum install make で対応可 |
mac |
make はXcode command line toolsに含まれる |
xcode-select --install が必要な場合あり |
windows | 標準ではmake がない |
MSYS2, Cygwin, wslなどが必要 |
→ Linux/macOS は問題なしだが、Windows は基本的にインストールが必要
まあ、Windowsで開発するならWSLをつかうと思うのであまり気にしなくてもいいきが
3. シェルスクリプト以外の実行が容易
Taskfile は シェルに依存せず、直接コマンドを実行できます。そのため、環境による違いを吸収しやすくなります。
Makefileとの違い
Taskfile の場合
tasks:
build:
cmds:
- echo "Compiling..."
- gcc main.c -o main
- シェルの設定(~/.bashrc, ~/.zshrc, ~/.profile など)の影響を受けません
- gcc は エイリアスや CC 変数の影響を受けず、直接パス上の gcc が実行される
- PATH の影響も受けにくい(Taskfile の実行環境の PATH に依存)
Makefile の場合
build:
@echo "Compiling..."
@gcc main.c -o main
この場合、make build を実行すると、シェルを通じて gcc が実行されます
- 環境変数の影響
export CC=clang
→ gcc を実行したつもりが、実際には clang が使われる可能性がある
- エイリアスの影響
alias gcc='clang'
→ gcc を実行したつもりが、clang が実行される
- PATHの影響
export PATH=/custom/bin:$PATH
→ gcc が /usr/bin/gcc ではなく /custom/bin/gcc になってしまう
4. 依存関係の管理が簡単
deps
を使って明示的にタスクの依存関係を管理できます。
Makefileは all: build test
のように指定する必要があるが、Taskfileは deps: [build, test]
とシンプルに書けます。
Makefileとの違い
Makefile の場合
.PHONY: all build test
all: build test
build:
@echo "Building..."
gcc main.c -o main
test: build
@echo "Running tests..."
./main --test
-
all
を実行するとbuild
->test
の順に実行される-
test
の前にbuild
を実行することで依存解決を定義してる
-
Taskfile の場合
version: '3'
tasks:
all:
deps: [build, test]
build:
cmds:
- echo "Building..."
- gcc main.c -o main
test:
deps: [build]
cmds:
- echo "Running tests..."
- ./main --test
-
deps
で依存関係を明示的に定義できる-
task all
を実行するとbuild
→test
の順に実行される -
test
のみを実行してもbuild
が先に実行される
-
5. 並列実行が簡単
run: parallel
を指定することで、タスクを並列実行できます。
Makefileとの違い
Makefile の場合
make -j 2 task1 task2
- Makefileは
make -j
オプションを使用する必要があります
Taskfile の場合
version: '3'
tasks:
build:
cmds:
- echo "Building..."
- gcc main.c -o main
lint:
cmds:
- echo "Linting..."
- pylint main.py
test:
cmds:
- echo "Running tests..."
- pytest test.py
all:
deps: [build, lint, test]
run: parallel # 並列実行
-
task all
を実行すると build・lint・test が 並列実行される -
run: parallel
をつけるだけで並列処理が可能(Makefile では -j を指定する必要がある)
6. Docker・CI/CD との相性が良い
dir
を指定することで実行ディレクトリを変更できたり、preconditions
を利用して環境チェックが可能です。
環境の定義漏れや Dockerfile のミスを防ぐことができます。
サンプル
1. 実行ディレクトリの変更
tasks:
build:
dir: ./src # srcディレクトリ内で実行
cmds:
- echo "Building in $(pwd)"
- gcc main.c -o main
- dir: ./src を指定すると、./src に移動してコマンドを実行
- cd ./src && make のような記述が不要
2. ローカル環境での依存ツールの確認
version: '3'
tasks:
setup:
desc: "ローカル環境のセットアップ"
preconditions:
- sh: command -v node # Node.js がインストールされているか
- sh: command -v docker # Docker がインストールされているか
cmds:
- echo "必要なツールがインストールされています!"
- npm install
- docker-compose up -d
- Node.jsやDockerのインストール確認を自動化
- 事前に環境が整っていないとエラーをだして処理を停止する
3. Dockerfile の定義漏れを防ぐ
tasks:
build-docker:
desc: "Docker イメージのビルド"
preconditions:
- sh: command -v docker # Docker がインストールされているか
- sh: docker info # Docker デーモンが起動しているか
cmds:
- docker build -t myapp:latest .
- docker run --rm myapp:latest
- Docker がインストールされているか、Docker デーモンが起動しているかを確認できる
- Dockerfile の定義ミスや、ローカルでのビルドエラーを早期に発見できる
4. CI/CD パイプラインでの利用
tasks:
deploy:
desc: "デプロイ処理"
preconditions:
- sh: command -v aws # AWS CLI がインストールされているか
- sh: aws configure list # AWS の認証情報が設定されているか
cmds:
- aws s3 sync dist/ s3://my-bucket
- aws cloudfront create-invalidation --distribution-id XYZ --paths "/*"
- AWS CLI のインストールと認証情報の設定確認
- CI/CD での環境ミスを未然に防ぐ
まとめ
- Taskfile は 可読性が高く、クロスプラットフォームで動作 する便利なタスクランナーです。
-
preconditions
を使うことで 環境のチェックを自動化 し、セットアップミスを防ぐことができます。 - 並列実行・依存関係の管理が容易 で、CI/CD との相性も抜群。
Makefile に比べて 環境依存が少なく、管理しやすい ため、チーム開発や CI/CD に最適
Discussion