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コマンドの省略例を見てみましょう。

マイグレーションする場合通常は以下のようなコマンドを実行します。

Makefileの設定例

make xxxx として実行したい場合はコマンド名+「:」(コロン)と記述し、開業後にタブ1文字インデントしてから実際に実行したいコマンドを記述します。

※Makefileはmakeコマンドを実行するディレクトリに配置する必要があります。以下の場合はLaravelのルートディレクトリです。

上記のように設定すると以下のようにマイグレーションを実行できます。

あれ? php artisan が makeに置き換わっただけでそれほど省略できてないんじゃ?と思われる方もいらっしゃると思います。

でもローカル環境で開発する場合、Laravelのディレクトリ単体ではなく大抵はDocker環境で行います。

ではDocker環境の場合どうなるでしょうか?

Docker環境の前提

Docker環境は以下の構成だと仮定します。

コンテナ名担当
appphp
webwebサーバ(apache,nginxなど)
dbデータベース(MySQL、PostgreSQLなど)

※Docker環境のMakefileはDockerのルートディレクトリに保存します。

Docker環境でのコマンド実行例

では、通常Docker環境でマイグレーションを実行する場合どのようなコマンドになるでしょうか?

かなりコマンドが長くなって面倒ですね。

でも以下のようにMakefileを設定すると、

以下のようにマイグレーションを実行できます。

とても簡単になりましたね!

実際のMakefile作成例

以下のようによく使用するartisanやcomposerのコマンドを設定すると便利になります。

最後のunit-seedについては引数 ${class} が指定されていることにお気づきでしょうか?

これは指定したテーブルのSeederのみを実行したい場合に以下のように実行可能になっています。

引数の指定を応用すると、以下のようにマイグレーションファイル作成時にプロジェクト内で共通のプリフィックス、命名規則にそったファイルを生成できます。

実行時には以下のように引数を指定します。

usersテーブル作成のマイグレーションファイル作成時

usersテーブルにroleカラムを追加するためのマイグレーションファイル作成時

さらに効率的な設定例

Docker環境の場合、artisanコマンド以外にも、コンテナのビルド、立ち上げ、終了など様々なコマンドを実行することになります。これらもすべてMakefileで簡略化が可能になります。

この他にもDBをテスト用に切り替えてテスト用データを投入してテストを一括実行といった複雑な作業もコマンド1つにまとめることも可能です。

メリット・デメリット

メリット、デメリットは以下のものがあげられます。

メリット

  • とにかくコマンドの実行が簡単になる
  • 複数の手順が必要な開発環境を構築する作業がコマンド一つで可能になる
  • コマンドを覚えるのが簡単になる
  • チーム内での命名規則の共通化が容易

デメリット

  • makeコマンドは実行するコマンドの名前しか引数で渡すことが出来ず、make引数として別途指定する必要があり、コマンドがほとんど省略できなくなる場合がある

例:dockerを使用しないModelの作成の場合

  • makeなし:php artisan make:model users
  • makeあり:make model NAME=users

ただ、Docker環境で運用する限りほぼデメリットは無いといっていいでしょう。

最後に注意しておきたいこと(とても重要!)

Dockerはあくまでも開発環境のみでLaravel部分のみ本番リリースする場合は良いのですが、Docker環境ごと本番リリースする場合は注意が必要です。

過去に関わったプロジェクトで重大インシデントが発生したことがありました。

Docker環境ごとリリースするプロジェクトだったのですが、あろうことか最上位の責任者が誤って稼働中の本番環境で以下のコマンドを実行してしまいました。

実行されるコマンドは以下です。

もう、とんでもないことだと想像できますよね?

そうです、本番環境のDBを消去しマイグレーションを1から再実行して初期データ投入の状態に戻ってしまったのです。

幸い前日までのバックアップがあり、当日データのみ再投入で事なきをえました。

こういったインシデントを防ぐためにgitリポジトリには本番用と開発環境用の2つのMakefileを用意し、環境構築時に適切な方を利用可能にするといった考慮が必要です。

用意するファイルの例

開発環境ではMakefile.developを、本番環境ではもう一方をMakefileにリネームして利用します。

本番用では致命的なことが発生するコマンドは除去し、必要最低限のもののみを設定しておくことをおすすめします。