最可靠方式是运行 composer config vendor-dir --absolute 获取真实 vendor 路径;查包位置用 composer show -i 包名 --path;全局包代码在 composer config --global home 下的 vendor 目录,命令在 bin-dir。

查当前项目的 vendor 目录真实路径
项目里 vendor/ 目录不一定在根目录下,它可能被 composer.json 或全局配置改过。硬写死 ./vendor 容易出错,尤其 CI/CD 或 Docker 环境里。
- 最可靠方式是运行
composer config vendor-dir --absolute(仅 Composer 2.2+ 支持),它会输出实际生效的绝对路径,比如/var/www/myapp/vendor - 如果提示命令不存在,说明你用的是旧版 Composer,退而求其次:先看项目是否显式设置了
vendor-dir:composer config vendor-dir;没输出就代表没覆盖,默认就是vendor/ - 注意:某些插件(如
hirak/prestissimo旧版、自定义 installer)可能干扰路径解析,导致--absolute返回空或错误值;可临时加--no-plugins测试:composer config vendor-dir --absolute --no-plugins
查某个包的具体安装位置
知道 vendor 在哪还不够,你往往要定位某个包的源码,比如调试 monolog/monolog 或确认是不是用了 symlink 版本。
- 直接查单个包:
composer show -i monolog/monolog --path,输出类似monolog/monolog 2.10.0 /var/www/myapp/vendor/monolog/monolog - 查全部已安装包及其路径:
composer show -i --path,适合批量检查或写脚本时读取 - 别手拼路径,比如
vendor/monolog/monolog—— 一旦vendor-dir被改过或用了composer/installers(如 WordPress 插件),路径就失效了
查全局安装的包在哪
全局包(如 laravel/installer、phpunit/phpunit)不归项目管,它们的代码和二进制文件是分开存的,容易混淆。
- 代码所在目录(即全局
vendor):composer config --global home,输出如/home/alice/.composer,真实包代码在/home/alice/.composer/vendor/ - 可执行命令位置(如
laravel命令本身):composer config --global bin-dir --absolute,通常是/home/alice/.composer/vendor/bin - 如果你能运行
phpunit却找不到它在哪,Linux/macOS 用which phpunit,再跟一次readlink -f $(which phpunit);Windows PowerShell 用Get-Command phpunit | Select-Object -ExpandProperty Definition
为什么不能只信 composer show 默认输出
composer show 不带参数时只列顶层依赖,且不显示路径;composer show -i 虽然列全了包,但依然没路径——很多人卡在这一步,反复 cd 进 vendor 猜目录名。
-
composer show --tree展示依赖关系,但不解决“文件在哪”的问题 -
composer show -v(verbose)在部分版本里会附带路径,但不稳定,不能当依据 - 真正能落地的只有带
--path的组合:它绕过了所有配置层抽象,直接问 Composer “你现在把这包放哪了”,结果来自运行时解析,不是静态配置
路径这事看着小,但一到容器重建、多环境部署、IDE 符号跳转或 Xdebug 断点设置时,错一点就卡半天。记住:以 show -i --path 和 config vendor-dir --absolute 的输出为准,其他都是参考。










