経緯
新しく購入したWindows PC でVSCode を使い始めたら、PHP 関連の拡張機能に「php のパスが正しく通ってませんよ」と指摘される。
Cannot validate since a PHP installation could not be found. Use the setting 'php.validate.executablePath' to configure the PHP executable.
Windows 自体にPHPを入れていれば問題ないのだけど、PHPは開発用Docker コンテナの中に入っているのみ。
PHPファイル自体、開発外で使うこともないので、VSCode にもローカルのWindows 環境ではなく
開発環境を参照しておいてほしい。
ので、コンテナ内のPHPへパスを通します。
環境
- Windows 11
- WSL2 (コマンドプロンプト/Powershell でubuntu コマンドが使える状態)
- Docker (WSL2内でdocker コマンドが使える状態)
やったこと
- WSL2 内にコンテナのPHPを実行させるスクリプトを作成
- Windows のVSCode で開いているプロジェクトのルートディレクトリにバッチファイルを作成
- パスとしてバッチファイルの場所を指定
1. WSL2 にスクリプトを配置
ubuntu コマンドでWSL2 環境へ入ります。
/usr/local/bin へphp という名前のファイルを作成:
sudo touch /usr/local/bin/php
権限を変更:
sudo chmod +x /usr/local/bin/php
php の中身を変更:
sudo vim /usr/local/bin/php
以下のように記載します。
path=$(printf '%s\n' "${PWD##*/}")
cd /mnt/c/User/(プロジェクトのルートディレクトリ)
command="docker exec (コンテナ名) php "$@""
echo "Running php on docker (コンテナ名)"
$command
コンテナ名は起動中であれば、プロジェクトのルートディレクトリとかでdocker container ps
とすれば確認できます。
スクリプト内でdocker コマンドを使っているので、WSL2 にはDocker が入っていることが必要になります。
WSL2 上の準備はこれでオーケー。
一旦、WSL2 を抜けます。
exit
ubuntu run でphp を参照できることを確認します。
ubuntu run php -v
PHP のバージョンが返ってくればオーケー。
Running php on docker (コンテナ名)
PHP 8.0.16 (cli) (built: Mar 1 2022 00:31:45) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.16, Copyright (c) Zend Technologies
with Xdebug v3.1.4, Copyright (c) 2002-2022, by Derick Rethans
with Zend OPcache v8.0.16, Copyright (c), by Zend Technologies
2. Windows ローカルにバッチファイルを配置
バッチファイルはVSCode で開いているプロジェクトのルートディレクトリに配置します。
以下の内容でphp.bat を作成します。
ubuntu run php %1
%1
には引数が入ります。
試しに、バッチファイルを作成したディレクトリで次を実行します。
./php.bat -v
引数として-v
を与えています。
先程と同様のPHP バージョン情報が返ってくればオーケーです。
3. バッチファイルの場所をパスとして指定
最後に、VSCode のsettings.json
内の必要な箇所にバッチファイルのパス./php.bat
を指定して完了です。
...
"php.debug.executablePath": "./php.bat",
...
"php.validate.executablePath": "./php.bat"
}
動作確認
一度VSCode を閉じて再起動します。
最初に出たような通知が出ないことを確認します。
参考
以下のページが元になっています。
ここではWindows ではなくLinux 環境で動いているコンテナが対象となっていたため、Linux 上のシェルを直接パスに指定しています。
今回は更にそのシェルへ向かうバッチファイルをWindows 上に作成し、無理やりWindows 環境に応用しました。
シェルと同様の動作をするバッチファイルを作ればもっと事態は簡単かもしれません。
あと、スクリプトの中身はほぼ引っ張ってきただけなので、path=$(printf '%s\n' "${PWD##*/}")
とかecho "Running php on docker (コンテナ名)"
とかの記述はひょっとしたら要らないんじゃないかな、やっぱ。