🦁

Makefileでローカル開発サーバーのコマンドを統一しよう

2023/06/21に公開

はじめに

フロントエンド開発を主務としていますが、バックエンドのローカル開発環境って結構バラバラですよね。

Docker使うプロジェクトが増えていると思いますが、Rails Serverのようなローカル起動のアプリケーションサーバーをそのまま使ったり、ほぼ無くなったけどVagrantなんかもありました。

主務としているわけではないため、いくつかのコマンドだけを繰り返し使うことになりますが、2つ以上の案件に関わっていると、「このプロダクトの起動コマンドなんだっけ?」 という確認の頻度が増えて、些末な時間ながらも調査時間がストレスになります。

起動コマンドを統一したい

個々に覚えておくのが億劫なため、まずはどこかに書いておくことを考えました。 かつてエイリアスなどの登録もおこなっていましたが、最近はMakefileを使うのが一番便利かな、と思っています。

Makefileとは?

もともとはUNIXにおけるビルドツール「make」で利用される実行手順ファイルで、テキストに記述された処理を順次実行してくれます。昨今のOSX(Mac)にはこの「make」コマンドが実行できる環境がデフォルトで用意されており、簡単に利用を始めることができます。

% make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0

Makefileの準備

プロジェクトごとのサーバーリポジトリ直下にMakefileをおきます。(これだけ)
ファイルのコミットが可能であれば非常にありがたいですが、基本的にプロダクト横断でコマンドを揃えたければオレオレ仕様にしたいため、gitignoreに追加するか、addしないよう注意するか、といった地味な運用をおこないます。

コマンド一覧の例

以下のような処理を実践できるよう、コマンドを先に揃えておきます。

make build … 初期構築 ※反復的に実行しないことがわかり、徐々に実装しなくなった
make up … サーバーを起動する ※昔はupd[デーモン起動]と分けてたけど、今はデーモン使用がデフォ
make down … サーバーを停止する
make migrate … データベースの最新化をおこなう
make console … コンソールを起動する(rails console / artisan tinker など…)
make db … SQLの実行が可能なコンソールを起動する
make init … データベースを空っぽにする
make seed … データベースにseedを用いたモックデータを適用する。

プロジェクト別設定の例

プロジェクトごとに次のように書き分けます。
※記事用に簡略化してますが、現場ではもう少し固有オプションが付いてたりします。

Rails Server

up: # サーバーを起動する
	bundle exec rails server -d
down: # サーバーを落とす
	bundle exec rails server
migrate: # 差分マイグレートを実行
	bundle exec rails db:migrate
console: # Railsコンソールを開く
	bundle exec rails console
db: # DBコンソールを開く
	bundle exec rails db
seed: # DBにseed適用する
	bundle exec rails db:migrate:reset
	bundle exec rails db:seed
	bundle exec rails server -d
init: # DBを空にする
	bundle exec rails db:migrate:reset
	bundle exec rails server -d

Rails on Docker

up: # サーバーを起動する
	docker compose up -d
down: # サーバーを落とす
	docker-compose down
migrate: # 差分マイグレートを実行
	docker-compose exec app rails db:migrate
console: # Railsコンソールを開く
	docker-compose exec app rails console
db: # DBコンソールを開く
	docker-compose exec app rails db
seed: # DBにseed適用する(アプリケーションサーバーのみ落とし、DB再構築)
	docker compose up -d
	docker-compose rm -fsv app
	docker compose exec rails db:migrate:reset
	docker compose exec rails db:seed
	docker compose up -d
init: # DBを空にする(アプリケーションサーバーのみ落とし、DB初期化)
	docker compose up -d
	docker-compose rm -fsv app
	docker compose exec rails db:migrate:reset
	docker compose up -d

総括

rubyであれ、phpであれ、ローカルサーバーで必要な操作はほぼ同じかと思います。
反復利用するコマンドはMakefileにおさめて、READMEからのコピペは早々に減らしましょう。

Discussion