vendor-dir 配置只能在 composer.json 或全局 config.json 中设置,不能通过命令行临时指定;修改后需删除旧 vendor 目录并重新运行 composer install/update 才生效。

不能直接用 config.vendor-dir 在命令行临时设置 vendor 目录名,必须写进 composer.json 或全局配置里才生效。
vendor-dir 配置只在 composer.json 或 config.json 里起作用
很多人试过 composer install --config.vendor-dir=libs 这类写法,结果 vendor 还是建在默认位置——因为 vendor-dir 不是运行时参数,而是配置项。它只被读取一次,在初始化项目或加载配置阶段。
- 项目级配置:写进项目根目录的
composer.json的config段里 - 全局配置:改用户家目录下的
composer/config.json(路径如~/.composer/config.json或%APPDATA%\Composer\config.json) - 执行
composer config命令只能修改配置文件,不会影响当前命令行为
正确写法:在 composer.json 里声明 vendor-dir
编辑项目 composer.json,确保 config 字段存在且包含 vendor-dir:
{
"name": "my/project",
"config": {
"vendor-dir": "third-party"
}
}
然后删掉现有 vendor 目录,再运行 composer install 或 composer update —— 新目录就会建在 third-party 下。
- 路径支持相对路径(如
"vendor-dir": "lib/vendor"),不支持绝对路径 - 如果
vendor-dir指向的路径已存在且非空,composer install会报错,需手动清空或换个名字 - 修改后所有后续命令(包括
dump-autoload)都会基于新路径工作
为什么 vendor-dir 改了,自动加载还报错?
Composer 自动加载器(vendor/autoload.php)是生成时硬编码了路径的。如果改了 vendor-dir 但没重装依赖,旧的 autoload.php 仍指向原来的 vendor 结构,导致 Class not found。
- 改完
vendor-dir后,必须删掉整个旧vendor目录(哪怕只是改名) - 必须重新运行
composer install或composer update,不能只跑dump-autoload - IDE(如 PHPStorm)可能缓存了旧的自动加载映射,需要刷新索引或重启
全局设置 vendor-dir 的实际影响
在全局 config.json 里设 vendor-dir,对所有新 init 的项目生效,但已有项目不受影响(它们以自己 composer.json 为准)。
- 全局设置容易引发协作混乱:别人 clone 你的项目,vendor 却出现在奇怪位置
- CI/CD 流水线通常禁用全局配置,依赖显式声明,所以项目级配置更可靠
- 某些共享主机或容器环境禁止写用户家目录,此时全局配置根本不可用
真正要改 vendor 名,就老老实实改 composer.json,删 vendor,重装——少绕弯,少查文档外的“黑魔法”。











