Makefile でローカル開発環境の「考古学」に終止符を打つ

今回は、I Replaced My Entire Local Dev Environment With a Single Makefile という記事を参考に、開発環境の複雑さをシンプルに保つための「Makefile」の活用術について整理してみます。
これ、昔やっていたんですが、make の書きにくさで断念して、それぞれのシェルスクリプトを作ると言う形に落ち着きました。今なら AI で作って貰えば良いから make に統一するのはありなのかなぁ。
開発現場で起こりがちな「考古学」の問題
新しいプロジェクトに参加したとき、あるいは数ヶ月ぶりに古いプロジェクトに戻ったとき、最初に行うのは「どうやって動かすか」を確認する作業ではないでしょうか。
READMEを読み、package.json の scripts を眺め、ときには scripts/ ディレクトリの奥深くに眠るシェルスクリプトを掘り起こす。こうした「考古学の発掘調査」のような作業に、最初の10分、あるいはそれ以上の時間を費やしてしまうことがよくあります。
プロジェクトごとに、開発サーバーの起動やテストの実行コマンドは微妙に異なります。 - あるプロジェクトでは npm run dev - 別のプロジェクトでは python manage.py runserver - また別のプロジェクトでは docker-compose up
こうした「コマンドの断片化」が、開発者の認知負荷をじわじわと高めているのかもしれません。
(※ 図はブログ記事をご参照ください)
なぜ今、あえて「Make」なのか
Makefileは50年近く前のツールであり、もともとはC言語のビルドのために作られました。しかし、現代のWeb開発においても、タスクランナーとして非常に優れた特性を持っています。
主な理由は以下の3点に集約されるかと思います。
最初からインストールされている ほぼすべてのLinux環境やmacOSに標準で入っています。新しいツールをインストールする必要も、チームメンバーに導入を依頼する必要もありません。
言語に依存しない Makeは単にシェルコマンドを実行するだけです。Node.js、Python、Go、Dockerなど、プロジェクトの技術スタックが何であっても、同じインターフェースを提供できます。
プロジェクトの「入り口」が明確になる プロジェクトのルートに Makefile が1つあるだけで、そのプロジェクトで何ができるのかが即座にわかります。
他のツールとの比較
(※ 表はブログ記事をご参照ください)
抽象化による一貫性の確保
Makefileを使う最大のメリットは、背後で動いている具体的なコマンドを隠蔽し、開発者の操作を一貫させられる点にあります。
たとえば、どのようなプロジェクトであっても、開発者は以下のようなコマンドを叩くだけで済むようになります。
make dev # 開発サーバーの起動
make test # テストの実行
make lint # 静的解析の実行
make clean # キャッシュや一時ファイルの削除
中身が npm test であろうと pytest であろうと、開発者が覚えるべき言葉は make test だけで済みます。これは、複数のプロジェクトを掛け持ちする際や、新しいメンバーがチームに加わった際に、非常に大きな助けになるかと思います。
「生きたドキュメント」としてのMakefile
Makefileをさらに便利にするための「裏技」があります。それは、Makefile自体に自己文書化機能を持たせることです。
引数なしで make を実行したときに、利用可能なコマンドとその説明を自動で表示するように設定しておくと、READMEを読みに行く手間すら省けます。
以下は、今回紹介されているテンプレートの核心部分を簡略化したものです。
.DEFAULT_GOAL := help
.PHONY: help
help: ## このヘルプメッセージを表示する
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) (※ 表はブログ記事をご参照ください)
.PHONY: dev
dev: ## 開発サーバーを起動する
npm run dev
.PHONY: test
test: ## テストを実行する
npm run test
.PHONY: clean
clean: ## キャッシュファイルを削除する
rm -rf dist/ .cache/
このように、ターゲットの横に ## でコメントを添えるだけで、make help(あるいは単に make)を実行した際に、色付きの綺麗なコマンドリストが表示されるようになります。
まとめ
高機能なタスクランナーやCLIツールは他にもたくさんありますが、「どこにでもある」「シンプルである」「言語を選ばない」というMakefileの特性は、今でも十分に価値があると感じます。
すべてのコマンドを1つのファイルに集約し、プロジェクトの「入り口」を統一してみる。それだけで、日々の開発のストレスが少しだけ軽減されるかもしれません。まずは、よく使うコマンドを3つほどMakefileに書き出すところから始めてみてはいかがでしょうか。
参照記事
I Replaced My Entire Local Dev Environment With a Single Makefile
Claude Code Insane Nerf. AMD Noticed (Here’s How You Fix It).
Why Every Developer Needs Claude Code Sub Agents (And How I Build Them)
詳しくはこちらをご覧ください。
