目前真正能用、不报错、不冲突的Composer插件只剩三个:kylekatarnls/update-helper(版本预警)、sandersander/composer-link(本地包软链接)、vaimo/composer-plugin(自动格式化composer.json);真插件须同时满足type为composer-plugin、extra中指定入口类、require composer-plugin-api三条件。

目前真正能用、不报错、不冲突的 Composer 插件只剩三个:kylekatarnls/update-helper、sandersander/composer-link 和 vaimo/composer-plugin。其他多数插件在 Composer 2.x 下已失效,装了反而会触发 Plugin is not compatible with Composer 2 报错。
怎么判断一个包是不是真正的 Composer 插件?
不是所有带 composer 字眼的包都是插件。真插件必须同时满足三项硬性条件:
-
"type": "composer-plugin"(不能是library或metapackage) -
"extra"中明确指定入口类:"class": "Vendor\Plugin\Class" -
"require"中包含"composer-plugin-api": "^2.0"(对应 Composer 2+)
常见误判:sebastian/phpcpd、phpunit/phpunit 这类只是 CLI 工具,没注册事件、不改 Composer 行为,纯靠手动调用——它们不是插件。
哪些插件现在还值得全局安装?
Composer 2.x 原生支持并行下载、锁文件校验和依赖解析优化,老插件如 hirak/prestissimo 必须卸载:
- 先执行
composer global remove hirak/prestissimo - 确认版本:
composer --version输出应为2.x(如2.7.6) - 当前仍安全可用的三个核心插件:
-
kylekatarnls/update-helper:每次composer update后告诉你「为什么没升到最新版」,比如monolog/monolog: 2.10.0 → 3.5.0 (constrained by ^2.0) -
sandersander/composer-link:本地包软链接,不改composer.json,不复制文件,只在vendor/建符号链接 -
vaimo/composer-plugin:自动格式化composer.json,修复缩进、排序字段、补全缺失空格
composer link 之后为什么 autoload 不生效?
sandersander/composer-link 链接成功后,vendor/ 下确实出现符号链接,但自动加载器不会自动感知被链接包的 autoload 变更:
- 若你修改了被链接包的
composer.json中的autoload规则(例如从"psr-4"改成"files"),必须手动运行composer dump-autoload -
composer update默认会重写整个vendor/,可能意外解除链接——插件不拦截该行为,开发期建议禁用自动更新,或显式加--with-dependencies控制范围 - 链接路径必须是含有效
composer.json的目录,且不能是相对路径嵌套过深(如../../../my-pkg在某些 shell 下会失败)
为什么 update-helper 的输出比看 changelog 更有用?
它不帮你升级,而是精准定位卡点:
- 扫描已安装包的实际版本 vs Packagist 上最新稳定版
- 比对
composer.json中的约束表达式(如"^2.8"、"~3.1.0"),明确指出是「约束太紧」还是「根本没发新版」 - 若项目设了
"minimum-stability": "dev",它可能把dev-main当作可升级目标——这时得人工判断,别盲信提示 - 典型输出里带括号说明原因,比如
(constrained by ^2.0)或(no stable release yet),一眼可知下一步动作
最易被忽略的是:这些插件全部依赖 composer global 的执行环境一致性。如果你用 Homebrew、Docker、PHPBrew 多版本共存,composer global config home 返回的路径必须与当前 composer 命令实际加载的 bin 目录一致,否则插件根本不会激活。











