vendor目录不能直接改名或移动,因其路径被autoload.php和composer.lock硬编码;唯一安全方式是通过composer.json的config.vendor-dir配置项指定新路径并执行composer install/update。

vendor 目录为什么不能直接改路径名
Composer 默认把包装进项目根目录下的 vendor 文件夹,这不是硬编码在源码里,而是由配置项 vendor-dir 控制的。但别想着手动重命名或移动这个文件夹——autoload.php 里写死了相对路径,composer.lock 也记录了完整结构,强行挪动会导致自动加载失败、Class not found 错误,甚至 composer install 报错中断。
用 composer.json 的 config.vendor-dir 正确指定位置
唯一安全的方式是在项目根目录的 composer.json 中声明 config 段:
{
"config": {
"vendor-dir": "lib/vendor"
}
}
然后执行:
-
composer install(首次安装)或composer update(已有 lock 文件时) - 旧
vendor目录会被自动删除,新包装进lib/vendor -
autoload.php和composer.lock全部自动适配新路径
注意:vendor-dir 值必须是相对于项目根目录的相对路径,不支持绝对路径;也不能用 ../ 跨出项目根目录,否则 Composer 会拒绝执行。
全局配置 vs 项目配置优先级
你可能在 ~/.composer/config.json 或通过 composer config -g 设过全局 vendor-dir,但项目级的 composer.json 中的 config.vendor-dir 永远优先。如果发现没生效,检查:
- 是否漏写了
config外层对象 - JSON 格式是否合法(逗号、引号、括号)
- 是否在错误的
composer.json里修改(比如子目录里的) - 是否运行了
composer dump-autoload而不是install/update—— 后者才真正重建 vendor
IDE 和部署脚本需要同步更新路径
改完 vendor-dir 后,很多地方不会自动感知:
- PHPStorm 的自动索引仍可能指向旧
vendor,需右键新目录 →Mark as → Sources Root - 部署脚本中硬编码的
vendor/autoload.php路径要改成lib/vendor/autoload.php - Dockerfile 或 CI 配置里若有
COPY vendor或类似逻辑,也得同步调整
最易被忽略的是:某些框架(如 Laravel)的 bootstrap/autoload.php 或 public/index.php 里显式 require 了 vendor/autoload.php,这种手写路径必须人工修正,Composer 不会帮你改这些文件。










