Earthly vs Make: 再現可能な build の比較
ほとんどのシステムでインストール不要な、依存関係を追跡する普遍的なタスクランナーが欲しいなら Make を選び、ローカルと CI で同じ挙動をするレイヤーキャッシュ付きのコンテナ化された再現可能な build が欲しいなら Earthly を選びましょう。
Make と Earthly はどちらも build ステップをオーケストレーションしますが、分離のレベルが異なります。Make はクラシックでほぼ普遍的な build ツールです。Makefile が target とファイル依存を定義し、最小限のコマンド集合を実行します。Earthly は各 build target をコンテナ内 (BuildKit を使用) で実行し、Dockerfile と Makefile のアイデアを融合した Earthfile 構文を持ち、マシン間および CI で再現可能な build を目指します。
| Earthly | Make | |
|---|---|---|
| 分離 | target ごとのコンテナ (BuildKit) | ホストの shell で実行 |
| 再現性 | 高 (固定されたベースイメージ) | ホスト環境に依存 |
| キャッシュ | Docker のようなレイヤーキャッシュ | ファイル target のタイムスタンプベース |
| インストールの負荷 | Earthly + Docker/BuildKit | 通常はプリインストール済み |
| 構文 | Earthfile (Docker + Make 風) | Makefile (tab に敏感) |
| 移植性 | ローカルと CI で同じ build | ホストのツールによって異なる |
それぞれが本当に優れている点
Make は普遍性とシンプルさで優れます。ほとんどの Unix システムにすでに存在し、コンテナ要件がなく、そのファイル依存モデルはインクリメンタルなローカル作業に最適です。Earthly は再現性とキャッシュで優れます。各ステップが固定イメージのコンテナ内で実行されるため「自分のマシンでは動く」問題が減り、BuildKit スタイルのレイヤーキャッシュが繰り返しの build を高速にします。
CI では
Earthly はローカルと CI の build を同一にするよう設計されており、環境の drift により runner でのみ発生する種類の失敗を減らします。実行間で build キャッシュを共有し、変更のないレイヤーの再実行を避けられます。CI での Make はより軽量ですが (Docker 不要)、runner に Makefile が前提とするのと同じツールチェーンのバージョンがあることを保証しないと build が乖離します。
正直な注意点
Earthly は Docker/BuildKit を必要とし、コンテナのレイヤーを追加するため、単純なタスクはより重く、起動は素の Make より遅くなります。Make はよりシンプルですが、その再現性はホストに完全に依存し、tab に敏感な構文と限られたエラー処理が初心者を戸惑わせます。
結論
環境がすでに制御されている場面での、軽量でホストネイティブなタスク実行には Make を使いましょう。マシン間および CI での再現性に加え、コンテナスタイルのキャッシュが Docker への依存に見合う場合は Earthly を使いましょう。