在 composer.json 的 config 段添加 "vendor-dir" 可自定义 vendor 目录位置,相对路径以 composer.json 为基准,修改后需删除旧 vendor 并执行 composer dump-autoload 刷新自动加载器,项目配置优先于全局配置。

composer.json 里怎么改 vendor 目录位置
直接在项目根目录的 composer.json 里加 "config" 段,用 "vendor-dir" 指定路径。它只影响当前项目,不污染全局配置。
- 路径支持相对(如
"lib/vendor")和绝对(如"/var/www/myapp/vendor"),但相对路径以composer.json所在目录为基准 - 如果路径不存在,
composer install或composer update会自动创建;但父目录必须可写,否则报错Could not create directory - 改完后记得删掉旧
vendor目录再运行安装命令,否则 autoload 可能仍引用旧路径
为什么 vendor-dir 改了却还报 Class not found
因为 Composer 的自动加载器(autoload)默认只扫描 vendor 下的包,而 vendor-dir 只控制安装位置,不自动重生成符合新路径的 autoloader —— 除非你强制刷新。
- 执行
composer dump-autoload是必须的,否则vendor/autoload.php里的路径映射仍是旧的 - 如果用了
"optimize-autoloader": true,还要加--no-dev或重新 dump,否则优化后的 classmap 仍指向原路径 - 检查
vendor/autoload.php文件头注释,里面会写明它“认为”的 vendor 根路径,和实际目录不一致就说明没生效
全局配置 vs 项目配置哪个优先级高
项目级 composer.json 中的 "vendor-dir" 总是覆盖全局配置(~/.composer/config.json 或 COMPOSER_HOME/config.json)。
- 全局设了
"vendor-dir": "/shared/vendor",但项目里写了"vendor-dir": "third-party",那最终就是third-party/ - 没有项目配置时,才 fallback 到全局;全局也没设,才用默认
vendor/ - 用
composer config --list可以看当前生效的完整配置,确认vendor-dir值是否被正确继承或覆盖
改 vendor 路径会影响哪些工具或部署流程
所有依赖 vendor/autoload.php 或硬编码 vendor/ 路径的地方都可能出问题,不是改个配置就万事大吉。
- PHPStan、Psalm 等静态分析工具,如果没显式指定
--autoload-file,会默认找vendor/autoload.php,路径一变就报 “Autoload file not found” - 部署脚本里写死的
rsync -av vendor/或cp -r vendor/必须同步更新路径,否则漏传依赖 - Docker 多阶段构建中,如果
COPY --from=builder /app/vendor/这类指令没跟着改,构建出来的镜像会缺包
dump-autoload,或者忘了改 CI/CD 脚本里的路径,结果本地能跑,上线就报错。










