VagrantとVirtualBoxでmac上にLaravel5.5の仮想環境を構築する！

# はじめに
Laravelの開発環境を整える上で、いつまでもホストOS上に環境を作っていたのでは本番環境の構築にすぬほど苦戦するだろうな、と思ったので、Laravelの環境構築を仮想環境を用いて行なっていきます。
本記事は『PHPフレームワーク Laravel Webアプリケーション開発』を参考にして作業を行なっています。書籍に合わせて、Vagrant+VirtualBoxでLaravel5.5の環境を構築します。

作業環境は以下の通りです。
- macOS　Mojave 10.14.5 
- Visual Studio Code(エディタ)


作業工程は以下の通り。
1. VirtualBoxのインストール
2. Vagrantのインストール
3. Homesteadのダウンロード
4. Homesteadの初期化・設定
5. Vagrantの起動
6. Laravelプロジェクトの作成

早速やっていきます。


## 1. VirtualBoxのインストール
はじめにVirtualBoxのインストールを行います。VirtualBoxはホストOS上で別のOSを仮想環境として構築できるソフトウェアです。
まずは以下のVirtualBox公式ダウンロードページへアクセスしてください。
[https://www.virtualbox.org/](https://www.virtualbox.org/)
すると以下の画面が現れると思います。
<img width="1280" alt="スクリーンショット 2019-07-17 9.38.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386550/1306c285-b1f6-63c2-1ec8-8b254f5c1a4e.png">
上記中央のDownload VirtualBox6.0をクリックして先へ進みます。
すると以下の画面になるので、
<img width="1280" alt="スクリーンショット 2019-07-17 9.42.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386550/80e7f2e6-c6e6-bf3f-ca56-11eee40b5dc2.png">
サイト中心(ちょい上くらい)からお使いのOSにあったパッケージをダウンロードしてください。自分はmacOSなので、OS X hostsからダウンロードしました。
あとはダウンロードしたインストーラの指示に従ってインストールを進めていくだけです。もしVirtualBoxのアプリケーションが見つからなかった場合は、Finder内のアプリケーションを調べれば見つかると思います。


## 2. Vagrantのインストール

引き続きVagrantのインストールをしていきます。VagrantはVirtualBoxなどの仮想環境ソフトウェアを、簡単に扱えるようにするツールです。
まず以下の公式ページにアクセスしてください。
[https://www.vagrantup.com/](https://www.vagrantup.com/)
すると以下の画面になるので、中心のDownloadをクリックしてください。
<img width="1280" alt="スクリーンショット 2019-07-17 14.47.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386550/bded407f-0c66-2ee2-4984-d4d1a741d995.png">

クリック後下にスクロールしてmacOS用のインストーラをダウンロードしてください。
<img width="1280" alt="スクリーンショット 2019-07-17 14.47.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386550/cf232502-ac12-e823-9cc2-a995d2fdf4b2.png">

VirtualBoxの時と同様に、インストーラの指示に従ってダウンロードを進めていけば完了です！


## 3.Homesteadのダウンロード
HomesteadはLaravelの実行に必要な様々なソフトウェアやツールがひとまとめになったセットのことです。

まず以下のコマンドを実行します。ここでは、homesteadのboxをダウンロードします。vagrantのboxとは、仮想環境のテンプレートのようなものです。さっくり環境を作れて便利。

```
$ vagrant box add laravel/homestead
```

すると以下のように、使用する仮想環境を聞かれるので、ここでは
3) virtualbox
を選択します。
"3"を入力してEnterを押してください。

```terminal
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://vagrantcloud.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) parallels
3) virtualbox
4) vmware_desktop

Enter your choice: 3
```

うまくいくと以下のように表示されます。

```
==> box: Adding box 'laravel/homestead' (v8.0.0) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/laravel/boxes/homestead/
versions/8.0.0/providers/virtualbox.box
    box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com
==> box: Successfully added box 'laravel/homestead' (v8.0.0) for 'virtualbox'!
```

以上のようにboxをダウンロードできたら、続いてHomestead用の設定ファイルをHomesteadという名前でgit colneします。


```
$ git clone https://github.com/laravel/homestead.git Homestead
```

これによってhomeディレクトリにHomesteadというディレクトリが作成されました。


## 4. Homesteadの初期化・設定

Homesteadを準備できたら、初期化と設定を行なっていきます。Homesteadの初期化はHomesteadに用意されているinit.shというスクリプトファイルを実行すれば簡単にできます。
以下のコマンドを実行してください。

```
$ cd ~/Homestead
$ bash ./init.sh
```

Homestead Initialized!と表示されたら成功です。
さらに以下のコマンドを実行して、Homesteadの設定ファイルに編集を加えていきます。
エディタはお使いの環境に合わせて変更してください。今回はVisual Studio codeの起動コマンドであるcodeを用いています。


```
$ code Homestead.yaml
```

上記コマンドを実行すると以下の内容が確認できると思います。


```

---
ip: "192.168.10.10"
memory: 2048
cpus: 2
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/code
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/public

databases:
    - homestead

features:
    - mariadb: false
    - ohmyzsh: false
    - webdriver: false

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp
```

上記の中から、今回の環境に沿った内容に設定を編集していきます。
といっても、変更する箇所は１箇所のみです。今回はsampleappという名前でLaravelプロジェクトを作成するので、sites:の項目を以下のように変更します。
また、念の為以下の#がついている項目も確認してください。ここで、"code"というディレクトリはホストOSと仮想環境の共有ディレクトリです。
今回はhomestead.testという名前で仮想環境へのアクセスを行います。これはsitesのmapに記載されています。今はまだアクセスできないので、次節で設定します。


```Homestead.yaml(editted)
...

provider: virtualbox #ここを確認

...

folders:
    - map: ~/code　#ここを確認
      to: /home/vagrant/code #ここを確認

...

sites:
    - map: homestead.test
      to: /home/vagrant/code/sampleapp/public #ここを編集
```

以上のように編集できたら、保存してエディタを閉じます。



## 5. vagrantの起動

vagrantを起動する前に、前節の通りhomestead.testという名前で仮想環境へアクセスしたいので、ホストOSの設定ファイルをいじります。

以下のコマンドを実行してください。

```terminal
code /etc/hosts
```
するとホストの設定ファイルを開けるので、末尾に以下のように書き加えます。
他の項目を編集してしまわないように気をつけてください。

```etc/host
...
192.168.10.10   homestead.test
```

これで仮想環境起動後のアクセスが可能になりました。
続けて以下のコマンドで仮想環境を起動します(めちゃくちゃ楽ですね)。

```
cd ~/Homestead
vagrant up
```

以上で起動ができたと思います。
もしかしたら以下の赤文字メッセージが出たかもしれません。

```
homestead-7: You are running composer as "root", while "/home/vagrant/.composer" is owned by "vagrant"
```

この場合も、今は気にしなくて大丈夫です(筆者の環境では大丈夫でした)。
もとからComposerをインストールしていると出るメッセージのようです。
余談ですが、composerをrootで実行するとセキュリティ上あんまり良くないらしいので、ここは調査項目ですね。

以上の手順が終わったら以下にアクセスしてください。
[http://homestead.test](http://homestead.test)

するとしっかりエラー的な文章が出ているかと思います。
No input file specified
と出ていれば成功です。これは、まだ表示すべきファイルが存在していないために表示されているメッセージです。


## 6. Laravelプロジェクトの作成
いよいよLaravelのプロジェクトを作っていきます。
まず以下のコマンドで、前節で起動した仮想環境にssh接続します。

```
$ vagrant ssh
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-54-generic x86_64)

Thanks for using 
 _                               _                 _ 
| |                             | |               | |
| |__   ___  _ __ ___   ___  ___| |_ ___  __ _  __| |
| '_ \ / _ \| '_ ` _ \ / _ \/ __| __/ _ \/ _` |/ _` |
| | | | (_) | | | | | |  __/\__ \ ||  __/ (_| | (_| |
|_| |_|\___/|_| |_| |_|\___||___/\__\___|\__,_|\__,_|

* Homestead v9.0.0 released
* Settler v8.0.0 released

0 packages can be updated.
0 updates are security updates.
```
上記の画面が表示されれば成功です。
homestead感が溢れてますね。

続いて以下のコマンドを入力してください。
codeディレクトリに移動したのち、Laravelのプロジェクトを作成します。

```
$cd ~/code
$ composer create-project laravel/laravel sampleapp --prefer-dist "5.5.*"
```

もし以上のコマンドを入力したときに

```
[RuntimeException]                                                                                 
  Could not delete /home/vagrant/code/sampleapp/vendor/kylekatarnls/
update-helper/src/UpdateHelper:  
```

が発生した場合は、以下のコマンドを試してみてください。おそらくですが、UpdateHelper内のスクリプトを実行する際にエラーを吐いているので、スクリプトを実行しないようにしてsampleappディレクトリで再インストールを行います。

```
$ cd sampleapp
$ composer install --no-plugins
```
筆者はここのエラーで詰まって２時間ほど溶かしました。いくら困ったからといっても、composerの入れ直しとかしないように！！（自戒）


インストールがうまくいったら、また下記にアクセスしてください。

[http://homestead.test](http://homestead.test)

ここでもし
No application encryption key has been specified.
というエラーが表示されていたら、sampleappディレクトリで以下のコマンドを実行してから、もう一度アクセスしてみてください。

```
$ php artisan key:generate
$ php artisan config:cache
```

上記コマンドは[こちらの記事](https://qiita.com/ponsuke0531/items/197c76fcb9300d7c5f36)を参考にさせていただきました。

うまくアクセスできると以下の画面のようになります。

<img width="1280" alt="スクリーンショット 2019-07-17 12.35.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386550/70a3ac63-4517-5c7d-4816-e2837bef7e11.png">

環境構築は以上で終わりです。お疲れ様でした！


# 終わりに
RuntimeExceptionの解消にかなりの時間を使ってしまいました。なんとか解決できましたが、LTS版とはいえ油断禁物ですね...一応エラー部分だけ[別記事](https://qiita.com/hppRC/items/9f09d123f08dc87992f8)に切り出しておきました。
Laravelでいろいろ作るのが楽しみです。