⚙️

Laravel Sail向けVSCode設定

に公開

Laravel Sail(Laravel用のDocker開発環境)で開発を行う機会があったので、VSCodeの静的解析ツールやフォーマッタなりを諸々Sail環境上で動作するよう設定した。
ホストOSにPHP環境を用意しない前提での設定があまり見当たらなかったので簡単にまとめる。

環境

  • Laravel Sail: 1.37.1
  • Docker (Client, Server): 27.x
  • Docker Compose: 2.34.0
  • VSCode Version: 1.96.2 (Cursor Version: 0.48.6)

使用する拡張機能

とりあえず導入した拡張機能は以下の通り。ホストOSにPHP実行環境がない場合、PHPStan, LaravelExtraIntellisense, Pintあたりが未設定ではエラーを吐く

.vscode/extensions.json
{
    "recommendations": [
        // 共通
        "EditorConfig.EditorConfig",
        "yzhang.markdown-all-in-one",
        "redhat.vscode-yaml",
        "hediet.vscode-drawio",
        // 静的解析
        "SanderRonde.phpstan-vscode",
        // フォーマッタ
        "esbenp.prettier-vscode",
        "open-southeners.laravel-pint",
        // 入力補完
        "bmewburn.vscode-intelephense-client",
        "amiralizadeh9480.laravel-extra-intellisense",
        // その他、便利ツール
        "neilbrayfield.php-docblocker",
        "onecentlin.laravel5-snippets",
        "m1guelpf.better-pest",
        "dansysanalyst.pest-snippets"
    ]
}

VSCode設定ファイル

以下のように設定することでSail環境上のPHPを利用してほぼ動作するようになる(はず)

.vscode/settings.json
{
    "php.validate.executablePath": "./php.sh",
    "LaravelExtraIntellisense.basePathForCode": "/var/www/html",
    "LaravelExtraIntellisense.phpCommand": "docker compose exec -w /var/www/html -u sail -t laravel.test php -r \"{code}\"",
    "phpstan.binCommand": [
        "docker",
        "compose",
        "exec",
        "-w",
        "/var/www/html",
        "laravel.test",
        "/bin/sh",
        "-c",
        "vendor/bin/phpstan analyze --error-format=json --no-interaction --no-progress --memory-limit=1G",
    ],
    "phpstan.configFile": "phpstan.neon",
    "phpstan.showTypeOnHover": false,
    "phpstan.checkValidity": true,
    "phpstan.showProgress": true,
    "phpstan.singleFileMode": true,
    "laravel-pint.runInLaravelSail": true
}

VSCode標準の入力補完 (php.validate)

https://code.visualstudio.com/docs/languages/php

コマンドの指定はできないが、実行パスを設定できるので以下のような実行ファイルを用意し、これを設定

php.sh
#!/bin/bash
docker compose exec laravel.test php "$@"
exit $?

LaravelExtraIntellisense

https://github.com/amir9480/vscode-laravel-extra-intellisense?tab=readme-ov-file#laravelextraintellisensephpcommand

LaravelExtraIntellisense.phpCommand

Command to run PHP codes to interact with your Laravel application.
Default: php -r "{code}"

Note: {code} is PHP code generated by extension and should be wrapped with "".

こちらは実行コマンドを指定できるので、docker composeでLaravelアプリケーションのコンテナ経由でphp -r \"{code}\"を実行するよう設定

PHPStan

PHPStanには実行するDockerコンテナ名を設定できるphpstan.dockerContainerNameがあるが、settings.jsonはGit管理しているのでディレクトリ名に依存する情報を含みたくない。
https://github.com/SanderRonde/phpstan-vscode/blob/v3.2.22/package.json#L86-L92

そのためIntellisenseと同様に、binCommanddocker composeを実行する方針で設定。
phpstanコマンドのオプション--no-progressが必要で、これがないとプログレスバーの出力により拡張機能側でエラーになる。
(他のオプションは割と適当)

https://github.com/SanderRonde/phpstan-vscode/blob/v3.2.22/package.json#L97-L104

phpstan.optionsでもコマンド引数を設定できるようだが、なにか勘違いしているのか、こちらだと期待通り動作しない。

Laravel Pint

Pint拡張機能にはrunInLaravelSailがあるのでこれを有効化する。

https://github.com/open-southeners/vscode-laravel-pint/issues/34

ただし現状のものは動作しないようで、古いバージョンに落とすと一応動くという状態。

https://github.com/open-southeners/vscode-laravel-pint/issues/49#issuecomment-2577891768

こちらも適当な実行ファイルを用意してdocker compose経由で実行する方針が無難かもしれない

雑感

  • ホストOSにPHPをインストールする必要がなくなり快適
    • PHPランタイムのインストールは自分で解決する必要のある依存関係が多かったり、ビルド自体が重い感覚があり避けたい
    • 諸々コンテナで完結させる需要は多そうだが、そうしたVSCode向けのセットアップは意外に未整備がち?
  • PHPStanがsingleFileModeを有効化してもかなり遅いため(効いてるのか?)、CIでのみ実行する方針として編集時の逐次実行はやめたほうが快適かもしれない
  • Cursor使ってると便利ツールの出番が少ない(というかほぼ使っていない)

Discussion