2018.10.07

MacでLaravel開発するならローカルの環境構築はValetもオススメ


この記事では、Laravel Valet を紹介します。Valet はローカル PC で動作する簡易 Web サーバーと考えていただくと良いでしょう。Nginx や Dnsmasq などのソフトウェアを組み合わせたライブラリです。サポートする OS は Mac のみです。

ちなみに、この記事で紹介する Valet のバージョンは 2.1.1 です。

Homestead と Valet

Laravel の開発環境構築といえば Homestead がスタンダードですが、Homestead が仮想マシン上に開発環境を構築するのに対し、Valet は基本的にローカルマシン内に構築されたアプリケーションを内部的に app-name.test というドメインで見られるようにする機能しかありません。

Valet のメリットとしては…

  • 仮想マシンを起動するよりずっと軽量で高速。
  • hosts ファイルや Homestead.yml などの設定が要らない。

要するに手軽なのですね。逆に例えば複数のバージョンの PHP や Laravel アプリを管理したいとか複雑なインフラ構成を再現したいというような仮想マシンのメリットを享受したい場合は Homestead を利用すればよいでしょう。

Mac 使い数人で小〜中規模のアプリを開発するなら Valet も全然ありだと思います。

ここからは Valet のインストール方法から使い方を紹介していきます。

インストール

準備

まずは準備として前提となるソフトウェアをインストールしましょう。仮想環境である Homestead とは異なりローカルに環境を構築するため、PC 自体に PHP やデータベースがインストールされている必要があります。

Homebrew

https://brew.sh/index_ja

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

PHP

$ brew install php@7.2

Composer

https://getcomposer.org/

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
$ mv composer.phar /usr/local/bin/composer

PostgreSQL

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

インストール後は psql でデータベースを作成できます。

$ psql -U postgres
Password for user postgres:
psql (9.6.3)
Type "help" for help.

postgres=# CREATE DATABASE sample;
postgres=# \q

Valet のインストールと起動

Valet は Composer でインストールします。

$ composer global require laravel/valet

~/.composer/vendor/bin にパスを通しておきましょう。

次に以下のコマンドで Valet を起動します。

$ valet install

アプリケーションの配信

Park(ディレクトリごとの管理)

まずは park コマンドを紹介します。

このコマンドをあるディレクトリで実行すると、そのディレクトリに格納されている Laravel アプリケーションが Valet によって http://ディレクトリ名.test という URL で配信されます。

例えば以下のようにプロジェクトを作成すると…

$ mkdir ~/Projects/laravel-app
$ cd ~/Projects/laravel-app
$ valet park
$ composer create-project laravel/laravel sample

http://sample.test という URL でアプリケーションが配信されます。

対象のディレクトリに複数の Laravel アプリが存在する場合でも同様です。

~/Projects/laravel-app
├ /alpha
├ /bravo
└ /charlie

上記の例ではそれぞれ http://alpha.testhttp://bravo.testhttp://charlie.test という URL でブラウザからアプリを確認できます。

Link(特定のアプリのみ配信)

続いて link コマンドです。

park が実行されたディレクトリ配下のすべてのアプリを配信するのに対して、link は特定のプロジェクトだけを配信します。

$ valet link app-name

既存のプロジェクトを Valet で配信したい場合に使用できるでしょう。

HTTPS

secure コマンドを使えばアプリケーションを HTTPS で配信することもできます。

$ valet secure app-name

アプリケーションが https://app-name.test で配信されます。

HTTP に戻すには unsecure コマンドを実行します。

$ valet unsecure app-name

以下、余談です。

私が secure コマンドを実行するとコマンドラインでは成功したように見えるのですが、ブラウザから確認すると ERR_CONNECTION_REFUSED が返ってきてしまいました。

Nginx のログを見るとこのようなログが。

$ tail /usr/local/var/log/nginx/error.log
2018/10/07 19:07:39 [emerg] 15526#0: PEM_read_bio_X509_AUX("/Users/masahiro.harada/.config/valet/Certificates/candy-store.test.crt") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)

証明書(candy-store.test.crt)に問題があると言っているよう。見てみると、証明書が作られてはいるのですが、中身が空っぽです。

$ ls -l ~/.config/valet/Certificates
total 24
drwxr-xr-x   6 masahiro.harada  staff   204 10  7 20:20 .
drwxr-xr-x  12 masahiro.harada  staff   408 10  7 20:17 ..
-rw-r--r--   1 masahiro.harada  staff   748 10  7 20:20 candy-store.test.conf
-rw-r--r--   1 masahiro.harada  staff     0 10  7 20:20 candy-store.test.crt
-rw-r--r--   1 masahiro.harada  staff  1086 10  7 20:20 candy-store.test.csr
-rw-r--r--   1 masahiro.harada  staff  1679 10  7 20:20 candy-store.test.key

デバッグしてみると、私の場合は証明書を生成するコマンドで srl ファイルを作ろうとして権限エラーが発生していました。

結局 Valet のソースコードを編集することでうまく動きました。

$ vi ~/.composer/vendor/laravel/valet/cli/Valet/Site.php

以下の部分を…
https://github.com/laravel/valet/blob/master/cli/Valet/Site.php#L302-L305

このように編集。

Site.php
if (!$this->files->exists($caSrlPath)) {
    $caSrlParam = ' -CAcreateserial';
}
$caSrlParam .= ' -CAserial ' . $caSrlPath;

再起動。

$ valet restart

ライブラリのコードを直接書き換えるのは居心地悪いですが、根本的な原因が分からない(そしてそんなに頻繁に使う機能でもなさそう…)のでとりあえずこれで OK としました 😅

ネットを調べても同じ症状は出てこなかったので一応書き残しました。

サイトをネットに公開する

share コマンドを実行すると、ngrok というライブラリによってローカル PC 内のアプリケーションを外部に一般公開することができます。

$ cd /path/to/app-name
$ valet share

たったこれだけでアプリがインターネットに公開され、http://abcd1234.ngrok.io/ のような一意の URL が与えられます。公開を停止するにはターミナルで Ctrl + C を入力します。

ポートを限定しているとはいえ、インターネットに PC の中身が晒されるわけなので、ちょっと怖いですね。言わずもがなですが、決して本番運用に使用してはいけません。公開にあたってはアプリ側で Basic 認証だけでもかけておくとよいと思います。

使いどころはあくまで一時的な公開ですね。プロトタイプをチームや顧客と共有するとか、モバイルでの動作確認など、いままで一度テスト環境にデプロイしないと〜となっていた作業の一部を代替できそうです 🤩


以上、Laravel Valet を利用したローカル環境開発について紹介しました。