リモート開発メインのソフトウェア開発企業のエンジニアブログです

Laravel Sail 初期化時に使用する PHP のバージョンを指定する

結論から言うと、例えば PHP 8.2 の環境が欲しければ php artisan sail:install --php php8.2 の様にコマンドラインオプション --php を指定します。

話は以上なのですが、経緯と今回調べた事を折角なのでまとめたいと思います。

プロジェクト概要

  1. 新規開発で実行環境は PHP 8.2 と決まっている
  2. バックエンドフレームワークとして Laravel を選定し、その時点で要件を満たす最新版である 11.x を採用
  3. Laravel Sail を使う事にした

Laravel インストール

ドキュメントに従って PHP 8.2 の環境で composer global require laravel/installer と laravel new example-app で初期化しました。作られた composer.json の require は以下の様な感じになりました:

"require": {
    "php": "^8.2",
    "laravel/framework": "^11.31",
    "laravel/tinker": "^2.9"
}

この require で指定されている PHP は laravel new (実態は composer create-project) を実行したインタプリタのバージョンではなく、単にその時最新版の laravel/laravel の composer.json の内容が使われる様です。今回は 11.3.3 が最新だったので laravel/laravel@11.3.3/composer.json の内容=PHP 8.2以上が使われています。なので例えば composer create-project laravel/laravel ./example-app 10.0.0 を実行すると、例え実行時の PHP が 8.4 であっても作られる composer.json の require は PHP 8.1 以上になります

Laravel Sail のインストール

こちらもドキュメントに従って composer require laravel/sail --dev と php artisan sail:install を実行します。すると、 docker-compose.yml が作られる訳ですが、肝心の PHP の実行環境は次の様に 8.3 で定義されます:

services:
    laravel.test:
        build:
            context: './vendor/laravel/sail/runtimes/8.3'
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
                MYSQL_CLIENT: mariadb-client
        image: 'sail-8.3/app'

    # ...

これも先ほどと同様、実行している PHP のバージョンがどうであれ、執筆時点で Laravel Sail の最新版である 1.38.0 で初期化を行うと必ず 8.3 が選ばれます。docker-compose.yml はこのファイルを元に作られるのですが、PHP のバージョンは {{PHP_VERSION}} と言うプレースホルダーが指定されています:

services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/{{PHP_VERSION}}
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-{{PHP_VERSION}}/app

    # ...

このプレースホルダーは sail:install コマンドのこの部分で特定のバージョンに置換されます。そのバージョンと言うのが、同コマンドの --php オプション (デフォルトで 8.3) の内容、と言う訳です。従って、Laravel Sail をインストールする際は artisan sail:install --php 8.2 と実行すべきだったのです。

Moba Pro

まとめ

  • Laravel は執筆時点で最新の 11.x では PHP 8.2 以上が必須. なので composer.json の require もそう指定される
  • ただし Laravel Sail の執筆時点で最新の 1.38.0 では artisan sail:install 時に --php オプションでバージョンを指定しないと、(おそらく) そのパッケージ時点で最新の PHP のバージョン (1.38.0 時点だと PHP 8.3) がデフォルトで入る
  • 新規プロジェクトではあるが実行環境に制限がある場合は注意が必要

余談

Laravel Sail を使うとコンテナ環境が簡単に構築できるので、次回以降の開発環境のセットアップが非常に簡単になります。しかし、Laravel Sail の実行には PHP と Composer によるパッケージのインストールが必須になります。では PHP が入っていない環境ではどうすればいいでしょうか?折角コンテナを使っているのにセットアップに結局 PHP が必要なのはちょっと矛盾している気もしますね。しかしこの点は Sail のドキュメントにしっかり書いてありました!

docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v "$(pwd):/var/www/html" \
    -w /var/www/html \
    laravelsail/php82-composer:latest \
    composer install --ignore-platform-reqs

初期化用のコンテナイメージを用意してくれているので、git clone 直後はこれを実行すればホストマシンに PHP が入っていなくてもセットアップができますね。(php82-composer の部分は php83php84 など好きなバージョンを指定する事が可能です)

← 前の投稿

次の投稿 →

M1 MacでDockerを使用するための覚書

コメントを残す