首先创建插件项目并配置composer.json,然后编写Plugin类实现PluginInterface和EventSubscriberInterface接口,通过订阅PRE_DEPENDENCIES_SOLVING和POST_DEPENDENCIES_SOLVING事件监听依赖解析过程,在onPreSolve和onPostSolve方法中添加日志输出,最后将插件以path方式引入测试项目并运行composer update验证事件触发。

Composer 是 PHP 的依赖管理工具,它允许开发者通过插件系统扩展其功能。如果你想编写一个 Composer 插件来监听依赖解析过程中的事件(比如包被解析、版本被选择等),你可以通过订阅 Composer 的事件系统来实现。
下面是如何编写一个简单的 Composer 插件来监听依赖解析相关事件的完整指南。
首先创建一个目录作为你的插件项目:
mkdir composer-dependency-listener cd composer-dependency-listener
初始化 composer.json:
{
"name": "your-vendor/composer-dependency-listener",
"description": "A plugin to listen to dependency resolution events",
"type": "composer-plugin",
"require": {
"composer-plugin-api": "^2.0",
"composer/composer": "^2.0"
},
"autoload": {
"psr-4": {
"YourVendor\DependencyListener\": "src/"
}
},
"extra": {
"class": "YourVendor\DependencyListener\Plugin"
}
}在 src/Plugin.php 中创建插件入口类:
<?php
namespace YourVendorDependencyListener;
use ComposerPluginPluginInterface;
use ComposerEventDispatcherEventSubscriberInterface;
use ComposerInstallerPackageEvent;
use ComposerScriptScriptEvents;
class Plugin implements PluginInterface, EventSubscriberInterface
{
public function activate($composer, $io)
{
// 插件激活时注册事件监听器
}
public static function getSubscribedEvents()
{
return [
ScriptEvents::PRE_DEPENDENCIES_SOLVING => 'onPreSolve',
ScriptEvents::POST_DEPENDENCIES_SOLVING => 'onPostSolve',
];
}
public function onPreSolve()
{
echo "[INFO] 开始解析依赖...
";
// 此时 DependencySolver 将要开始运行
}
public function onPostSolve(PackageEvent $event)
{
$operations = $event->getOperations();
echo "[INFO] 依赖解析完成,共 " . count($operations) . " 个操作:
";
foreach ($operations as $op) {
echo " - " . $op->getOperationType() . ": " . $op->__toString() . "
";
}
}
}在你自己的项目中测试这个插件:
path 本地方式引入。composer.json 中添加依赖:{
"repositories": [
{
"type": "path",
"url": "../composer-dependency-listener"
}
],
"require-dev": {
"your-vendor/composer-dependency-listener": "*"
}
}然后执行:
composer update
当你运行 composer install 或 update 时,应该能看到输出:
[INFO] 开始解析依赖... [INFO] 依赖解析完成,共 X 个操作: - install: drupal/core 9.0.0 - update: symfony/yaml v5.0.0 => v5.1.0 ...
Composer 提供多个与依赖解析相关的事件:
$event->getOperations() 获取安装/更新/删除的操作列表。注意:Composer 没有暴露“每个包被选中”的细粒度钩子,因为底层使用 solver 算法(由 composer/semver 驱动),不支持中间状态监听。但你可以通过分析最终的 Transaction 操作来反推结果。
如果你需要更深入控制或调试,可以在插件中通过反射或监听器注入方式尝试访问 ComposerInstallerSolver,但这属于非公开 API,不推荐生产使用。
基本上就这些。通过标准事件机制,你就能有效监听依赖解析的前后状态,用于日志、审计或 CI 分析场景。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号