Laravel Sail PHPバージョン変更のエラー – Your Composer dependencies require a PHP version “>= 8.0.0”

LaravelでPHPを8.0から7.4に変更したプロジェクトを作ろうとしてこの問題に遭遇したので共有しておきます。

以前(手元の明確な記録はないが2021年8月ごろ)は公式サイトの手順で問題なかった。

https://laravel.com/docs/8.x/sail#sail-php-versions (英語)
https://readouble.com/laravel/8.x/ja/sail.html#sail-php-versions (日本語)

今日実施したところエラーでループして接続できない。

[myapp] $ ./vendor/bin/sail up
Creating network "myapp_sail" with driver "bridge"
Creating myapp_mysql_1 ... done
Creating myapp_laravel.test_1 ... done
Attaching to myapp_mysql_1, myapp_laravel.test_1
(略)
laravel.test_1  | 2021-10-10 02:25:38,569 INFO spawned: 'php' with pid 17
laravel.test_1  | Composer detected issues in your platform:
laravel.test_1  | 
laravel.test_1  | Your Composer dependencies require a PHP version ">= 8.0.0". You are running 7.4.24.2021-10-10 02:25:39,711 INFO success: php entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
laravel.test_1  | 2021-10-10 02:25:39,712 INFO exited: php (exit status 104; not expected)
(以下 これの繰り返し)

なにかが、PHP8.0以上を要求していて失敗を繰り返している。
(sail(docker-compose) up -d でデタッチしていたり、docker dashboard から実行だけしていると気づかない、logs でみると気付ける)

解決方法 その1 – 古いインストーラーを使う

はじめは原因特定できなかったので、手っ取り早く古い7.4用のインストーラーを使用しました。

通常は以下のように実行するところ

$ curl -s "https://laravel.build/myapp?with=mysql" | bash

いったんスクリプトをファイル出力して編集して実行する

$ curl -s "https://laravel.build/myapp?with=mysql" > inst.sh

出力したファイルの”php80-composer”を”php74-composer”に変更して実行する

docker info > /dev/null 2>&1

# Ensure that Docker is running...
if [ $? -ne 0 ]; then
    echo "Docker is not running."

    exit 1
fi

docker run --rm \
    -v $(pwd):/opt \
    -w /opt \
    laravelsail/php80-composer:latest \
    bash -c "laravel new myapp && cd myapp && php ./artisan sail:install --with=mysql"

cd myapp

CYAN='\033[0;36m'
LIGHT_CYAN='\033[1;36m'
WHITE='\033[1;37m'
NC='\033[0m'

echo ""

if sudo -n true 2>/dev/null; then
    sudo chown -R $USER: .
    echo -e "${WHITE}Get started with:${NC} cd myapp && ./vendor/bin/sail up"
else
    echo -e "${WHITE}Please provide your password so we can make some final adjustments to your application's permissions.${NC}"
    echo ""
    sudo chown -R $USER: .
    echo ""
    echo -e "${WHITE}Thank you! We hope you build something incredible. Dive in with:${NC} cd myapp && ./vendor/bin/sail up"
fi
$ bash inst.sh

(自動でやる場合)
$ curl -s "https://laravel.build/myapp?with=mysql" | sed 's/php80-composer/php74-composer/' | bash

あとは公式の説明のとおり、docker-compose.yml を編集して build しなおして完了

解決方法その2 – PHP8.0依存を解決する

私がPHP歴/composer歴が浅いので調べながらですが、composer.lockファイルを検索してPHP8を要求しているパッケージを探したところ、ひとつだけいました。

$ grep '"php".*8' composer.lock
                "php": "^7.0|^8.0",
                "php": "^7.1 || ^8.0"
                "php": "^7.1 || ^8.0"
                 (略)
                "php": "^7.0 || ^8.0"
                "php": "^7.0 || ^8.0",
                "php": ">=8.0.0"
                "php": "^8.0 || ^7.0 || ^5.5.9",
                 (略)

中身を確認すると “psr/log” さんでした。

        {
            "name": "psr/log",
            "version": "2.0.0",
            "source": {
                "type": "git",
                "url": "https://github.com/php-fig/log.git",
                "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376",
                "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376",
                "shasum": ""
            },
            "require": {
                "php": ">=8.0.0"
            },
(以下略)

はい、面倒なので再構築します。※公式の手順でPHP7.4の状態にしてからです!
手順は色々あると思いますが、エラー出続けても作業するしか無いので、up -d したのちにdocker内でcomposerを実行します。(dockerの外でできる場合にはそれでも良いですが、外のPHPに依存することになるのでおすすめしません)

$ cd myapp
$ ./vendor/bin/sail up -d
$ ./vendor/bin/sail shell
sail@65533e567502:/var/www/html$ composer update   ← docker内
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Downgrading psr/log (2.0.0 => 1.1.4)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Downloading psr/log (1.1.4)
  - Downgrading psr/log (2.0.0 => 1.1.4): Extracting archive
Generating optimized autoload files
(以下略)

updateがバージョンアップしか対応していないと思い込んでこの発想にたどり着かず、遠回りをしましたが、狙い通り psr/log さんがダウングレードされています。こいつだけだったっぽい。PHPは5.3.0以上の要求に変わっていました。
あとは念の為、down / up して確認しましたがその後は問題ないようです。

Mac環境です。。。。考え方は一緒かと。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください