composer show -p 只显示已安装包的符号链接路径,未安装则报错;真实路径需用 readlink -f 或 --prefer-source 安装;脚本化获取应组合 composer config vendor-dir 与包名。

composer show -p 查不到包路径?先确认是否已安装
直接运行 composer show -p vendor/package-name 报错 “Package not found” 是最常见原因——这个命令只对已安装到 vendor/ 下的包有效,不查 composer.json 里声明但未 install 或 update 的包。
- 先执行
composer install或composer update vendor/package-name - 再用
composer show -p vendor/package-name,比如composer show -p monolog/monolog - 若仍报错,检查包名是否拼写正确(注意大小写、斜杠方向)
show -p 输出的是符号链接目标,不是真实物理路径
在启用了 composer install --prefer-dist(默认)且包有 dist 包时,composer show -p 返回的是 vendor/vendor/name 目录,但它可能是指向 ~/.composer/cache/files/... 的符号链接。实际文件并不在 vendor/ 内部存储。
- 想看真实磁盘位置:用
readlink -f vendor/vendor/name(Linux/macOS)或dir vendor\vendor\name+ 观察“快捷方式指向”(Windows) - 强制解压到
vendor/本地:安装时加--prefer-source,之后show -p才返回可编辑的真实路径 -
show -p对path类型仓库(如本地开发包)才稳定返回可写的物理路径
替代方案:用 composer config vendor-dir + 包名拼接
当 show -p 不可用或需脚本化获取路径时,更可靠的方式是组合 composer config vendor-dir 和包命名规则:
vendor_dir=$(composer config vendor-dir) package_path="$vendor_dir/vendor/package-name" echo "$package_path"
- 该方式不依赖包是否已安装,只依赖
vendor-dir配置(默认为vendor) - 注意:包目录名由
vendor和name小写+短横线组成,和composer.json中name字段完全一致 - 如果项目自定义了
vendor-dir(如"vendor-dir": "lib/vendor"),必须先读取配置,不能硬编码vendor/
调试时快速定位:vendor/autoload.php 里的类映射也能反推
某些包没提供标准目录结构(比如仅含 autoload.files),show -p 虽能返回路径,但里面可能没有源码——这时要看自动加载逻辑:
- 打开
vendor/composer/autoload_static.php,搜索包名,找$files或$classMap数组项 - 路径通常以
dirname(__DIR__)开头,对应的就是该包在vendor/下的真实子目录 - 对 PSR-4 包,
composer dump-autoload -o后再查autoload_psr4.php,键名即命名空间,值为目录路径
路径问题本质是 Composer 加载机制和缓存策略的叠加结果,别只盯着 show -p 输出——它只是个快捷入口,不是文件系统真相的权威来源。










