vendor目录默认位于执行composer install命令的当前工作目录下,即pwd命令显示的路径,而非项目根目录或系统其他目录。

composer install 后 vendor 目录默认在哪儿
就在你运行 composer install 或 composer update 的那个目录下,**当前工作目录**,不是项目根目录、不是用户家目录、也不是 PHP 安装目录——就是你敲命令时所在的那个文件夹。
常见错误现象:在项目子目录(比如 src/ 或 public/)里执行了 composer install,结果 vendor 出现在子目录里,导致自动加载失效、require 'vendor/autoload.php' 找不到。
- 检查当前路径:终端里输入
pwd(macOS/Linux)或cd(Windows),确认是不是项目根目录(即含composer.json的那层) - vendor 位置由
COMPOSER_HOME环境变量和composer.json中的"config": {"vendor-dir": "..."}共同决定,但绝大多数情况没配过,就走默认值vendor/ - 如果项目用了自定义
vendor-dir,必须在composer.json的config段里明确定义,否则 composer 不会读取任意配置文件或环境变量来改位置
怎么确认 vendor 真的生成成功了
别只看有没有报错,要验证 autoload 是否可用、包是否真被解压进来了。最直接的方式是查 vendor/autoload.php 文件是否存在,且能被 require。
常见错误现象:命令输出 “Installing dependencies”,但 vendor 目录空空如也,或者只有 composer/ 子目录;可能是权限问题、磁盘满、或 Composer 被中断后残留了锁文件。
- 先删掉
vendor/和composer.lock(谨慎操作,确保你有composer.json备份) - 运行
composer install --no-cache -vvv,加-vvv能看到实际解压路径和失败点 - 检查
vendor/bin/下有没有预期的可执行文件(比如phpunit、laravel),这是比“目录存在”更可靠的安装完成信号
vendor 不在项目根目录?可能动了 config
Composer 支持通过 config 配置修改 vendor 存放位置,但它不会自动继承全局设置,只认当前项目的 composer.json 或本地 composer.json(即执行命令所在目录下的那个)。
使用场景:大型 monorepo 项目想把所有依赖统一放在顶层 vendor/,或某些部署脚本强制指定路径。
- 改法:在项目根目录的
composer.json里加这段:"config": { "vendor-dir": "../shared/vendor" } - 注意路径是相对于
composer.json的位置,不是相对于命令执行位置 - 改完必须重新运行
composer install,旧 vendor 不会自动迁移,得手动清理 - PHP 自动加载器会按新路径生成,所以
require '../shared/vendor/autoload.php'就得跟着改,否则报错failed to open stream: No such file or directory
为什么有时候 vendor 看不见,但程序还能跑
因为有些环境(比如 Docker、共享主机、CI/CD 流水线)会把 vendor 目录挂载进来、预构建好、或用 composer install --no-dev --optimize-autoloader 打包进镜像,本地根本没生成 vendor。
性能影响:vendor 路径不一致会导致 class_exists()、ReflectionClass 等依赖真实文件路径的功能出问题,尤其在测试或热重载场景下。
- 开发机上永远以本地
vendor/为准,别依赖远程同步或“应该有”这种假设 - 用
composer show --installed查已安装包列表,它读的是vendor/composer/installed.json,如果这文件不存在,说明 vendor 根本没装成功 - IDE(如 PHPStorm)有时会缓存 autoload 映射,删了 vendor 后记得清缓存并重新索引,否则代码跳转、补全会失灵
ls -la | grep vendor,再 cat composer.json | grep vendor-dir,两步确认比猜快得多。










