Makefileを使ってローカル開発環境の効率アップをしてみませんか?
目次
Makefileって何?
MakefileとはLinuxやmac系OSで利用可能なmakeコマンドで複雑なコマンドなどを簡略化して実行するための設定ファイルです。
あれ?Windows系では利用できないの?とご心配される方もいらっしゃるでしょう。
大丈夫です。ちゃんとWindows版もあります。以下からダウンロード可能です。
https://gnuwin32.sourceforge.net/packages/make.htm
なんと最終更新日が20年前です!でもちゃんと動きます。
そもそもURLの末尾がhtmlではなく、htmというのも歴史を感じますね。
注意点としてダウンロードしてインストールしただけでは動作しません。
環境変数でmake.exeの保存先へPathを通す必要があります。
環境変数の設定例

本当に効率的なの?
ここではLaravelで多用するartisanコマンドの省略例を見てみましょう。
マイグレーションする場合通常は以下のようなコマンドを実行します。
> php artisan migrate
Makefileの設定例
make xxxx として実行したい場合はコマンド名+「:」(コロン)と記述し、開業後にタブ1文字インデントしてから実際に実行したいコマンドを記述します。
※Makefileはmakeコマンドを実行するディレクトリに配置する必要があります。以下の場合はLaravelのルートディレクトリです。
migrate:
php artisann migrate
上記のように設定すると以下のようにマイグレーションを実行できます。
> make migrate
あれ? php artisan が makeに置き換わっただけでそれほど省略できてないんじゃ?と思われる方もいらっしゃると思います。
でもローカル環境で開発する場合、Laravelのディレクトリ単体ではなく大抵はDocker環境で行います。
ではDocker環境の場合どうなるでしょうか?
Docker環境の前提
Docker環境は以下の構成だと仮定します。
| コンテナ名 | 担当 |
| app | php |
| web | webサーバ(apache,nginxなど) |
| db | データベース(MySQL、PostgreSQLなど) |
※Docker環境のMakefileはDockerのルートディレクトリに保存します。
Docker環境でのコマンド実行例
では、通常Docker環境でマイグレーションを実行する場合どのようなコマンドになるでしょうか?
> docker-compose exec app php artisann migrate
かなりコマンドが長くなって面倒ですね。
でも以下のようにMakefileを設定すると、
migrate:
docker-compose exec app php artisann migrate
以下のようにマイグレーションを実行できます。
> make migrate
とても簡単になりましたね!
実際のMakefile作成例
以下のようによく使用するartisanやcomposerのコマンドを設定すると便利になります。
install:
docker-compose exec app composer install
update:
docker-compose exec app composer update
migrate:
docker-compose exec app php artisan migrate
fresh:
docker-compose exec app php artisan migrate:fresh --seed
seed:
docker-compose exec app php artisan db:seed
unit-seed:
docker-compose exec app php artisan db:seed --class=${class}
最後のunit-seedについては引数 ${class} が指定されていることにお気づきでしょうか?
これは指定したテーブルのSeederのみを実行したい場合に以下のように実行可能になっています。
> make unit-seed class=UsersTableSeeder
引数の指定を応用すると、以下のようにマイグレーションファイル作成時にプロジェクト内で共通のプリフィックス、命名規則にそったファイルを生成できます。
create:
docker-compose exec app php artisan make:migration create_${NAME}_table –create={NAME}
alter:
docker-compose exec app php artisan make:migration alter_${NAME}_${change} --table=${NAME}
実行時には以下のように引数を指定します。
usersテーブル作成のマイグレーションファイル作成時
> make create NAME=users
作成されるファイル
yyyy_mm_dd_His_create_users_table.php
usersテーブルにroleカラムを追加するためのマイグレーションファイル作成時
> make alter NAME=users change=add_role
作成されるファイル
yyyy_mm_dd_His_alter_users_add_role.php
さらに効率的な設定例
Docker環境の場合、artisanコマンド以外にも、コンテナのビルド、立ち上げ、終了など様々なコマンドを実行することになります。これらもすべてMakefileで簡略化が可能になります。
up: #コンテナ立ち上げ
docker-compose up -d
down: #コンテナをdown
docker-compose down
restart: #再起動 ※@makeで他コマンドを呼び出し可能
@make down
@make up
init: #初期環境構築
docker-compose exec app composer install
docker-compose exec app cp .env.example .env
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan storage:link
docker-compose exec app php artisan migrate:fresh --seed
web: #webコンテナに入る
docker-compose exec web bash
app: #phpコンテナに入る
docker-compose exec app bash
app: #dbコンテナに入る
docker-compose exec db bash
この他にもDBをテスト用に切り替えてテスト用データを投入してテストを一括実行といった複雑な作業もコマンド1つにまとめることも可能です。
メリット・デメリット
メリット、デメリットは以下のものがあげられます。
メリット
- とにかくコマンドの実行が簡単になる
- 複数の手順が必要な開発環境を構築する作業がコマンド一つで可能になる
- コマンドを覚えるのが簡単になる
- チーム内での命名規則の共通化が容易
デメリット
- makeコマンドは実行するコマンドの名前しか引数で渡すことが出来ず、make引数として別途指定する必要があり、コマンドがほとんど省略できなくなる場合がある
例:dockerを使用しないModelの作成の場合
- makeなし:php artisan make:model users
- makeあり:make model NAME=users
ただ、Docker環境で運用する限りほぼデメリットは無いといっていいでしょう。
最後に注意しておきたいこと(とても重要!)
Dockerはあくまでも開発環境のみでLaravel部分のみ本番リリースする場合は良いのですが、Docker環境ごと本番リリースする場合は注意が必要です。
過去に関わったプロジェクトで重大インシデントが発生したことがありました。
Docker環境ごとリリースするプロジェクトだったのですが、あろうことか最上位の責任者が誤って稼働中の本番環境で以下のコマンドを実行してしまいました。
> make flesh
実行されるコマンドは以下です。
> docker-compose exec app php artisan migrate:fresh --seed
もう、とんでもないことだと想像できますよね?
そうです、本番環境のDBを消去しマイグレーションを1から再実行して初期データ投入の状態に戻ってしまったのです。
幸い前日までのバックアップがあり、当日データのみ再投入で事なきをえました。
こういったインシデントを防ぐためにgitリポジトリには本番用と開発環境用の2つのMakefileを用意し、環境構築時に適切な方を利用可能にするといった考慮が必要です。
用意するファイルの例
docker
└ Makefile.production
└ Makefile.develop
開発環境ではMakefile.developを、本番環境ではもう一方をMakefileにリネームして利用します。
本番用では致命的なことが発生するコマンドは除去し、必要最低限のもののみを設定しておくことをおすすめします。



















