Laravel 整理整頓したマイグレーションファイルを生成するライブラリを作った話

新しくv4.0をリリースしたので、解説記事をリニューアルしました！
[Laravel × Dacapo データベースマイグレーションサポートツールの使い方](https://qiita.com/ucan-lab/items/e75ef2bba744d9dcd4d0)

この記事は [Laravel Advent Calendar 2018](https://qiita.com/advent-calendar/2018/laravel) 24日目の記事です。

## 記事を書くにあたって

自作ライブラリを公開してcomposerでインストールできるようにする記事を書こうと思ったのですが、こちらの [[Laravel]あなたもOSS貢献！GitHubに自作ライブラリを公開してcomposerでインストールできるようになるまで](https://qiita.com/hirossyi73/items/726dac272bf9a6af2f08) 記事と思いっきりネタが被ってしまうため、急遽作ったライブラリについての紹介記事を書くことにしました🙇‍♂️

## 作成したライブラリのGitHubリポジトリ

[Laravel Dacapo](https://github.com/ucan-lab/laravel-dacapo)

# 予備知識

## マイグレーションとは

Laravelではデータベースのテーブル作成や編集などを管理する方法として「マイグレーション」という機能が標準搭載されています。

1. マイグレーションファイルの作成
2. マイグレーションの実行

マイグレーションファイルにテーブルの定義を記述し、マイグレーションの実行により、MySQL等の実際のデータベースにテーブルを作成します。
これをGitで管理することにより、チーム内で同一のテーブル構成にできたり、テーブル定義の変更の履歴を管理できるメリットがあります。

# 困っていること

## マイグレーションファイルの作成のファイル名が見辛い問題

```
$ php artisan make:migration create_tasks_table
```

`database/migrations/2018_11_14_121306_create_tasks_table.php`
と日付＋マイグレーション名でどんどん生成されていきますが、ファイルが増えるとすごく見辛いです。

開発初期段階は作り直しもよく発生するので日付を揃えたい。

## make:migration コマンドが遅い問題

コマンドを実行して、マイグレーションファイルが生成されるのになぜか時間がかかります。
Macのローカル環境で10秒かかり、dockerコンテナ内で実行すると21秒かかりました。

これはそこまで困ってないですが、謎に時間がかかるのが謎です。

# Laravel-Dacapo

この問題を解決したく、[Laravel Dacapo](https://github.com/ucan-lab/laravel-dacapo)を作りました！

## ライブラリ名の由来

名前となった[ダ・カーポ（da capo）](https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%BB%E3%82%AB%E3%83%BC%E3%83%9D)は音楽用語で「始めに戻って繰り返す」という意味があります。

Composerは作曲家という音楽に関わる名称なのでピッタリだなと個人的に思いました😊

## インストール

```
$ composer require --dev ucan-lab/laravel-dacapo
```

ライブラリをインストールして、設定ファイルを配置します。

```
$ php artisan vendor:publish --provider="UcanLab\LaravelDacapo\ConsoleServiceProvider"
```

`database/shema.yml` ひな形ファイルが用意されます。

### schema.yml

```
users:
  timestamps: true
  columns:
    id: increments
    name:
      type: string
    email:
      type: string
      unique: true
      nullable: true
    email_verified_at:
      type: timestamp
      nullable: true
    password:
      type: string
  rememberToken: true

password_resets:
  columns:
    email:
      type: string
      index: true
    token:
      type: string
    created_at:
      type: timestamp
      nullable: true
```

上記の記述にすれば、Laravel標準のマイグレーションファイルを生成します。

## コマンド

### マイグレーションファイル生成

```
$ php artisan dacapo:generate
Cleard Migration Directory
Created Migration: 1970_01_01_000000_create_users_table.php
Created Migration: 1970_01_01_000000_create_password_resets_table.php
```

`schema.yml` を読み込んで、マイグレーションファイルを生成します。

- `1970_01_01_000000` => テーブル作成
- `1970_01_01_000001` => インデックスキー
- `1970_01_01_000002` => 外部キー

このように整理整頓されてマイグレーションファイルが生成されます。

#### マイグレーションファイル生成、マイグレーション実行

```
$ php artisan dacapo:generate --fresh
```

#### マイグレーションファイル生成、マイグレーション実行、シーディング実行

```
$ php artisan dacapo:generate --seed
```

### マイグレーションファイルを全削除

```
$ php artisan dacapo:clear
```

## 本番運用が始まったら...

開発の初期段階だとテーブル作り直しはよくやりますが、本番運用が始まってしまうと大変なことになります。
本番運用が始まったらschema.ymlとdacapoは削除して、通常のマイグレーションに移行しましょう!!!

## 今後について

Laravelのマイグレーションに全て対応してる訳じゃなく、自分が使う範囲のことにしか確認できてないです。
READMEをもう少し充実させたいのと罪を犯したソースコードを書き直したい衝動に駆られてます。

## 使ってもらった感想

schema.ymlに全テーブルの情報があるのでフィールド探すのがすごく楽だと言われました。
それは目的ではなかったのですが、1ファイルにまとまってると検索もしやすいし便利だよねってことでした。(運用始まったら使えなくなるけど...。)