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あたりが未設定ではエラーを吐く
{
"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を利用してほぼ動作するようになる(はず)
{
"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
}
php.validate
)
VSCode標準の入力補完 (
コマンドの指定はできないが、実行パスを設定できるので以下のような実行ファイルを用意し、これを設定
#!/bin/bash
docker compose exec laravel.test php "$@"
exit $?
LaravelExtraIntellisense
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管理しているのでディレクトリ名に依存する情報を含みたくない。
そのためIntellisenseと同様に、binCommand
でdocker compose
を実行する方針で設定。
phpstan
コマンドのオプション--no-progress
が必要で、これがないとプログレスバーの出力により拡張機能側でエラーになる。
(他のオプションは割と適当)
phpstan.options
でもコマンド引数を設定できるようだが、なにか勘違いしているのか、こちらだと期待通り動作しない。
Laravel Pint
Pint拡張機能にはrunInLaravelSail
があるのでこれを有効化する。
ただし現状のものは動作しないようで、古いバージョンに落とすと一応動くという状態。
こちらも適当な実行ファイルを用意してdocker compose
経由で実行する方針が無難かもしれない
雑感
- ホストOSにPHPをインストールする必要がなくなり快適
- PHPランタイムのインストールは自分で解決する必要のある依存関係が多かったり、ビルド自体が重い感覚があり避けたい
- 諸々コンテナで完結させる需要は多そうだが、そうしたVSCode向けのセットアップは意外に未整備がち?
- PHPStanが
singleFileMode
を有効化してもかなり遅いため(効いてるのか?)、CIでのみ実行する方針として編集時の逐次実行はやめたほうが快適かもしれない - Cursor使ってると便利ツールの出番が少ない(というかほぼ使っていない)
Discussion