composer show -ip 可精准显示已安装包的实际路径,如 composer show -ip monolog/monolog 输出其 vendor 目录下的绝对路径;需确保在项目根目录、vendor/composer/installed.json 存在且未损坏。

composer show 查看包安装路径
执行 composer show 会列出所有已安装包及其版本,但默认不显示路径。加 -i(或 --installed)参数才只显示已安装的,再配合 -p(--path)就能输出实际安装目录:
composer show -ip vendor/package-name
比如查 monolog/monolog 的位置:composer show -ip monolog/monolog,输出类似 /path/to/project/vendor/monolog/monolog。
常见错误:漏掉 -p,只输 composer show monolog/monolog —— 这时只显示描述和依赖,路径为空;或者输错包名(大小写敏感、带斜杠),返回“Package not found”。
注意:composer show 的路径是相对于当前项目根目录的,不是绝对路径;如果项目用了 vendor-dir 自定义配置,它会自动适配那个目录。
插件类包(如 composer-plugin)怎么定位
Composer 插件本身也是包,但它们可能不会出现在 composer show 的常规列表里——尤其是全局安装的插件(如 hirak/prestissimo 或 phpstan/extension-installer),因为它们注册在全局 Composer 配置中。
分两种情况处理:
- 项目内安装的插件:用
composer show -ip vendor/plugin-name,和普通包一样 - 全局安装的插件:先查全局 vendor 路径:
composer global config home,然后进该目录下的vendor/找对应包名
典型陷阱:误以为 composer global list 能列出插件路径——它只列包名和版本,不带路径;还有人直接搜 ~/.composer/vendor,但新版 Composer 默认用 ~/.config/composer(Linux/macOS)或 %APPDATA%\Composer(Windows),路径得先确认。
vendor/autoload.php 不能反向推导包路径?
有人想从 vendor/autoload.php 文件往上扒路径,这是行不通的。这个文件只是自动加载入口,不包含任何包路径映射逻辑;它的内容由 composer dump-autoload 生成,路径信息全在 vendor/composer/autoload_psr4.php 等中间文件里,且是 namespace → 目录的映射,不是包名 → 路径的直连。
更关键的是:一个包可能有多个 PSR-4 命名空间,对应不同子目录;而插件类包甚至可能没 PSR-4 映射(靠 classmap 或 files 加载),所以不能靠 autoload 文件倒推。
实操建议:别绕路,直接用 composer show -ip;如果命令失效(比如锁文件损坏),就去 vendor/ 目录下手动 ls -d vendor/*/* | grep -i plugin-name。
为什么有时候 composer show -ip 报错或没输出
不是命令写错了,而是环境或状态问题:
- 当前不在项目根目录(
composer.json和vendor/不在当前路径下) - 运行了
composer install --no-scripts或删过vendor/composer/installed.json,导致 Composer 无法识别已安装状态 - 包是通过
path仓库本地链接的,composer show仍会显示路径,但指向的是你本地源码目录,不是 vendor 子目录
这时候最稳的办法是:cd 到项目根目录,运行 composer install --dry-run 看是否报依赖异常;没问题就 ls vendor/ 手动确认是否存在目标目录。
真正容易被忽略的一点:Composer 的“已安装”判断依赖 vendor/composer/installed.json,这个文件一旦被编辑或清空,-p 就会失效——它不读 composer.lock,也不扫描文件系统。










