可通过 composer global list 查看已识别的全局插件,但仅显示声明 type: composer-plugin 并正确注册 autoloader 的包;更可靠方式是直接查看 ~/.composer/vendor/(linux/macos)或 %appdata%composervendor(windows)目录内容。

怎么查看已安装的全局 Composer 插件
Composer 全局插件装在哪、装了啥,不查根本不知道——它不会主动告诉你。最直接的方式是看 composer global list,但注意:这个命令只显示通过 composer global require 安装的包,且要求这些包声明了 type: composer-plugin 并正确注册了 autoloader。
更稳妥的做法是直接翻目录:~/.composer/vendor/(Linux/macOS)或 %APPDATA%Composervendor(Windows),里面每个子目录就是一个全局安装的包,插件通常也在这里。
- 如果
composer global list输出为空,不代表没装插件——可能只是没被识别为“插件类型”,或者用了旧版 Composer( - 某些插件(如
hirak/prestissimo)在 Composer 2+ 中已被弃用或失效,list不显示也不奇怪 - 别依赖 ide 或文件管理器直接删目录——可能残留 autoload 映射,下次运行
composer命令会报错
卸载全局插件的正确命令是 composer global remove
不是 uninstall,不是 delete,也不是 require --dev 的反向操作。唯一可靠方式就是 composer global remove vendor/package-name。
例如卸载常用的 phpstan/phpstan 全局版本:composer global remove phpstan/phpstan;卸载旧版加速插件:composer global remove hirak/prestissimo。
- 必须写全 vendor/package 格式,只写包名(如
phpstan)会报错[InvalidArgumentException] Package "phpstan" not found - 卸载后 Composer 会自动重生成
~/.composer/vendor/autoload.php,无需手动 dump-autoload - 如果提示
Package is not installed,先确认是否真装在全局(而非项目本地),或检查拼写和大小写(Composer 对大小写敏感) - Windows 用户注意路径权限:若用管理员 CMD 安装过,普通用户执行
remove可能失败,建议统一用非管理员身份操作
为什么 composer global remove 有时不生效
常见原因是插件本身没走标准 Composer 安装流程,而是被硬链、软链进 vendor 目录,或通过脚本手动复制进去。这时候 remove 找不到对应包信息,就什么也不做。
另一个高频原因是 Composer 配置了自定义 home 路径(比如用 COMPOSER_HOME 环境变量指向别处),导致 global 命令操作的是另一个目录,而你以为删的是当前看到的那个。
- 查真实全局路径:
composer config --global home,别凭记忆猜 - 如果插件是用
git clone && composer install手动部署的,remove完全无效,得进对应目录手动rm -rf - 某些插件(如
symfony/cli)本质是独立二进制,只是借 Composer 分发——卸载后还得手动删~/.symfony/bin这类路径
卸载后还要检查哪些地方
插件卸载不等于彻底消失。尤其涉及命令行扩展的插件(比如添加了 composer audit 或 composer normalize),它们可能在 shell 初始化文件里写了 alias 或函数,或者把二进制软链到了 /usr/local/bin。
- 运行
which composer-audit或type composer-normalize,看是否还有残留命令 - 检查
~/.bashrc、~/.zshrc或%USERPROFILE%AppDataRoamingComposerbin是否有手动添加的 PATH 或 alias - 如果之前用过
composer global config bin-dir自定义过 bin 目录,记得清空该目录下的可执行文件(如phpstan、php-cs-fixer) - 最后验证:
composer list | grep -i "audit|normalize|fix",确保新命令确实没了
插件机制本身没有中心化注册表,卸载这件事,永远比安装多一层“人眼确认”。