この記事では、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
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
PHP
$ brew install php@7.2
Composer
$ 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.test
、http://bravo.test
、http://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
このように編集。
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 を利用したローカル環境開発について紹介しました。