答案是通过事件名称解析和环境变量COMPOSER_COMMAND判断执行命令。可在脚本中使用$argv传参、读取COMPOSER_COMMAND环境变量或在事件类中解析事件名来识别install或update命令。
在 Composer scripts 中,无法直接通过内置变量获取当前执行的命令名称(如 install、update 等),但可以通过一些间接方式判断或传递命令信息。
使用自定义脚本并显式传参
最可靠的方式是在 composer.json 中定义脚本时,手动将命令名称作为参数传递给 PHP 脚本。
例如:
{ "scripts": { "post-install-cmd": [ "php handle-script.php install" ], "post-update-cmd": [ "php handle-script.php update" ] } }
在 handle-script.php 中接收参数:
<?php $command = $argv[1] ?? 'unknown'; echo "当前执行的命令是: " . $command;
通过环境变量识别执行上下文
Composer 在执行某些脚本时会设置特定环境变量,可以用来判断上下文。
例如,判断是否是 install 或 update:
<?php if (getenv('COMPOSER_COMMAND') === 'install') { echo "正在执行 composer install"; } elseif (getenv('COMPOSER_COMMAND') === 'update') { echo "正在执行 composer update"; }
COMPOSER_COMMAND 环境变量通常可用于大多数标准命令场景。
在事件监听类中使用 Event 对象
如果使用的是 PHP 类作为脚本处理器,可以通过 ScriptEvent 对象获取命令信息。
<?php use ComposerScriptEvent; class MyScriptHandler { public static function postCmd(Event $event) { $command = $event->getComposer()->getCommand(); // 注意:并非所有版本都支持 getCommand() // 更稳妥的方式是通过 $event->getName() 获取事件名 $eventName = $event->getName(); // 如 post-install-cmd if (strpos($eventName, 'install') !== false) { echo "由 install 命令触发n"; } elseif (strpos($eventName, 'update') !== false) { echo "由 update 命令触发n"; } } }
对应的 composer.json 配置:
{ "scripts": { "post-install-cmd": "MyScriptHandler::postCmd", "post-update-cmd": "MyScriptHandler::postCmd" } }
基本上就这些。Composer 没有提供直接获取原始 CLI 命令的统一方法,推荐结合 事件名称解析 和 环境变量 COMPOSER_COMMAND 来判断执行上下文。不复杂但容易忽略细节。
以上就是在php js json composer 处理器 环境变量 php composer json Event 对象 事件