📘

TaskfileとMakefileの違い

2025/02/18に公開

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 が実行されます

  1. 環境変数の影響
export CC=clang

→ gcc を実行したつもりが、実際には clang が使われる可能性がある

  1. エイリアスの影響
alias gcc='clang'

→ gcc を実行したつもりが、clang が実行される

  1. 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 を実行すると buildtest の順に実行される
    • 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