Composer Scriptsのphpと@phpの違い
はじめに
ComposerにはScripts
という機能を使って任意のコマンドを登録し実行することができる。
このScripts
にコマンドにphpスクリプトを登録する際にphp
と@php
のどちらを使えばいいのか迷ったので違いを調べてみた。
環境
- PHP 8.3.8
- Composer 2.7.7
サンプルコード
<?php
echo 'サンプルPHPコマンド' . PHP_EOL;
{
"scripts": {
"echo-php": "php echo.php",
"echo-@php": "@php echo.php"
}
}
phpを指定する場合
ターミナルからphpコマンドを実行するときと一緒です。
% php echo.php
サンプルPHPコマンド
% composer echo-php
> php echo.php
サンプルPHPコマンド
つまり、phpコマンドのパスが通っていないと実行できないってことでいいはず。
@phpを指定する場合
Composerのドキュメントに書いてある@php
の説明
To execute PHP scripts, you can use @php which will automatically resolve to whatever php process is currently being used:
google翻訳を使うと...
PHP スクリプトを実行するには、現在使用されている PHP プロセスを自動的に解決する @php を使用できます。
つまり、@php
を使う事で、phpコマンドのパスを自動で探し出して実行してくれるってことでいいのかな?
実際にそれらしいコードをみると...
この2行でphpコマンドのパスを取得していることがわかる。
※symfony/process
の内容は今回はスルーします。
$finder = new PhpExecutableFinder();
$phpPath = $finder->find(false);
Composerのドキュメントをもう少しみると、次のようなことが書かれている。
You can also call a shell/bash script, which will have the path to the PHP executable available in it as a PHP_BINARY env var.
環境変数のPHP_BINARYの内容を見ているってことで、
PHPマニュアルにも、次のように書かれているから、@php
を指定すると、自動でphpコマンドのパスを取得して実行しているようですね。
スクリプト実行時の PHP バイナリのパス。
まとめ
どちらを指定しても、phpコマンドの実行は可能みたいです。
ただし、環境次第ではphpコマンドのパスが指定されていない場合もあるかもしれないので、その辺を考慮するなら@php
を使っておいた方がいいかもしれないですね。
Discussion