vendor目录位置由COMPOSER_VENDOR_DIR环境变量决定,优先级最高;config.vendor-dir自Composer 2.0起已废弃,设了也无效并触发警告。

composer install 时 vendor 目录写在哪,由 COMPOSER_VENDOR_DIR 环境变量决定
Composer 默认把依赖包装进项目根目录下的 vendor 文件夹,但这个位置不是硬编码死的,而是运行时动态确定的。优先级最高的是环境变量 COMPOSER_VENDOR_DIR —— 只要它存在且非空,Composer 就会无条件用它作为 vendor 路径。
实操建议:
- 临时改一次:执行
COMPOSER_VENDOR_DIR=/path/to/my-vendor composer install(Linux/macOS);Windows 用set COMPOSER_VENDOR_DIR=C:\my-vendor && composer install - 永久生效:把
COMPOSER_VENDOR_DIR加进系统或用户环境变量(注意重启终端/IDE 才能生效) - 别在
composer.json里配这个路径——它不支持通过配置文件设置 vendor 目录
修改 composer.json 的 config.vendor-dir 是无效的
很多老教程说在 composer.json 的 config 下加 "vendor-dir": "lib/vendor" 就能改路径,这是过时行为。自 Composer 2.0 起,config.vendor-dir 已被完全废弃,设了也无视,还会触发警告:The "config.vendor-dir" option is deprecated, use the "COMPOSER_VENDOR_DIR" environment variable instead.
常见错误现象:
- 改完
composer.json运行composer install,发现vendor还在原处 - 执行
composer diagnose显示上述弃用警告 -
composer dump-autoload失败,报找不到vendor/autoload.php—— 因为 autoloader 仍按默认路径生成,而实际 vendor 在别处
改了 vendor 路径后,autoload.php 和自动加载必须同步处理
Composer 不只是挪文件夹,它生成的 vendor/autoload.php 是硬编码了相对路径的启动器。如果你把 vendor 移到别处,但代码里还写 require 'vendor/autoload.php';,就会直接报错:Fatal error: require(): Failed opening required 'vendor/autoload.php'。
使用场景:适合 CLI 工具、Docker 构建、或需要隔离依赖的多项目共享场景。
实操建议:
- 代码中加载 autoload 必须用绝对路径或动态计算,例如:
require __DIR__ . '/path/to/my-vendor/autoload.php'; - 如果用 PSR-4 自动加载,确保
composer.json中的autoload配置没依赖 vendor 目录结构(它只管类名映射,不关心 vendor 位置) - Dockerfile 中推荐用环境变量 + ENTRYPOINT 包装,避免硬编码路径
全局改 vendor 路径会影响所有本地项目,但不会影响全局命令
COMPOSER_VENDOR_DIR 是 per-project 生效的——它只作用于当前命令执行时所在的项目目录。也就是说,你在 A 项目下设了环境变量,B 项目不受影响;但如果你在 shell 配置里全局 export 了它,那所有项目都会走那个路径,容易引发混乱。
性能与兼容性影响:
- 路径含空格或中文?Composer 会报错退出,务必用纯英文、无空格路径
- 路径不在当前项目目录内(比如跨磁盘、挂载点)?某些插件或脚本可能因 realpath 判断失败出问题
- Git 提交时记得更新 .gitignore —— 原来的
/vendor规则失效了,得加上新路径
最常被忽略的一点:改完路径后,composer.lock 文件本身不记录 vendor 位置,但它记录了每个包的完整安装路径(含 vendor 子目录)。所以换路径重装后,lock 文件内容其实变了——这意味着你不能靠 lock 文件“还原”旧 vendor 结构。










