LaravelでMakefileを使って効率的にコマンドのショートカットを作成する方法

Laravelプロジェクトにおいて、Makefileを使用してよく使うコマンドを効率的に実行するためのショートカットを作成する方法を紹介します。Makefileを使うことでコマンドを簡略化し、開発効率を向上させることができますのでぜひ使ってみてください。

## Makefileとは
作業の自動化などに使われますが、今回はコマンドの簡略化に焦点をあてて解説します。
```
 ターゲット:
	コマンド
```
まずは**ターゲット**と**コマンド**をペアで定義します。
```
 make ターゲット
```
上記をターミナルなどで実行すると、定義した**コマンド**が自動で走ってくれるという優れものです。

### 例えば・・・
Laravel開発においてよく使うartisanコマンドを例に挙げてみます。
まずはMakefileに以下を記述します。
```
 mig:
	php artisan migrate
```
そしてターミナルなどで
```
$ make mig
```
として実行してみると
```
$ make m-mig
Enter migration name: test

INFO  Migration [database/migrations/2024_07_27_155038_create_test_table.php] created successfully.
```
しっかり`php artisan migrate`が実行されています。

makeコマンドのセットアップについては下記をご参照ください。

・[Windows10環境でmakeコマンドを使用する方法【ハマリ回避】](https://qiita.com/BARANCE_TW/items/c7ffdb311df84d47bddd)


## Makefileをどこに置くか
**make**コマンドを打つ際は実行場所と同階層に**Makefile**という名前で配置する必要があります。
**Laravel**のプロジェクトの場合、**Makefile**は **.env**ファイルと同じ階層に置くのが一般的です。
### 例えば・・・
```

laravel/
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── tests/
├── .env
├── artisan
├── composer.json
├── composer.lock
├── Makefile  # Makefile
```
大体このように置きます。

## コマンドリストを作る
まず**Makefile**は
```
$ make
```
上記のようにターゲットを何も指定しないとデフォルトでは一つ目のターゲットが実行されます。
```
 mig:
     php artisan migrate
     
 seed:
     php artisan db:seed
```
この場合、`php artisan migrate`が実行されます。
これを活かすと、
```
command-list:
	@echo "command list"
	@echo "make mig  - php artisan migrate"
	@echo "make seed - php artisan db:seed"
```
何も指定しなければコマンド一覧が出るようになります。
実際に実行してみると
```
$ make 
  command list:
    make mig  - php artisan migrate
    make seed - php artisan db:seed
```
とコマンドリストが出るのでとても使いやすくなりました。

## プロンプトを入力させる
Laravelでは**マイグレーションファイル**などを作成するとき名前を決めますよね。
そのような場合は**Makefile**を以下のようにします。
```
m-mig:
	@read -p " Enter migration name: " name; \
	php artisan make:migration create_$${name}_table
```
上記のように定義してコマンドをたたくと、
```
$ make m-ctrl
  Enter controller name: 
  //testと入力
   INFO  Migration [database/migrations/2024_07_27_155038_create_test_table.php] created successfully.  
```
指定通りに**マイグレーションファイル**が作成されています。
## さいごに
いかがだったでしょうか？
すぐに使えて効率化を狙えるのでとてもおすすめです。
最後に他の**artisan**コマンドを一部掲載しますのでどんどんカスタマイズしていってください。
```
default:
	@echo "command list:"
	@echo " make mig            - php artisan migrate"
	@echo " make mig-roll       - php artisan migrate:rollback"
	@echo " make mig-status     - php artisan migrate:status"
	@echo " make seed           - php artisan db:seed"
	@echo " make tinker         - php artisan tinker"
	@echo " make test           - php artisan test"
	@echo " make cache-clear    - php artisan cache:clear"
	@echo " make m-mig          - php artisan make:migration"
	@echo " make a-mig          - php artisan make:migration --table=table_name"
	@echo " make c-mig          - php artisan make:migration --table=table_name"
	@echo " make m-model        - php artisan make:model"
	@echo " make m-model-mig    - php artisan make:model -m"
	@echo " make m-rule         - php artisan make:rule"
	@echo " make m-ctrl         - php artisan make:controller"

mig:
	php artisan migrate

mig-roll:
	php artisan migrate:rollback

mig-status:
	php artisan migrate:status

seed:
	php artisan db:seed

tinker:
	php artisan tinker

test:
	php artisan test

cache-clear:
	php artisan cache:clear

m-mig:
	@read -p " Enter migration name: " name; \
	php artisan make:migration create_$${name}_table

a-mig:
	@read -p " Enter column name: " column; \
	read  -p " Enter table name:  " table; \
	php artisan make:migration add_$${column}_to_$${table}_table --table=$${table}

c-mig:
	@read -p " Enter column name: " column; \
	read  -p " Enter table name:  " table; \
	php artisan make:migration change_$${column}_in_$${table}_table --table=$${table}

m-model:
	@read -p " Enter model name: " name; \
	php artisan make:model $$name

m-model-mig:
	@read -p " Enter model name: " name; \
	php artisan make:model $$name -m

m-rule:
	@read -p " Enter rule name: " name; \
	php artisan make:rule $$name

m-ctrl:
	@read -p " Enter controller name: " name; \
	php artisan make:controller $$name

```