Composer仅支持相对路径设置vendor目录,需通过config.vendor-dir配置或COMPOSER_VENDOR_DIR环境变量实现;修改后必须同步更新autoload引入、部署脚本、IDE配置及bin命令路径,否则必报错。

Composer 不能把 vendor 目录直接安装到 D 盘(或其他任意绝对路径),比如 D:/myproject/vendor —— 它只接受相对于 composer.json 所在位置的**相对路径**。硬写绝对路径会报错:Could not create directory 或静默失败。
用 config.vendor-dir 改路径(最常用)
这是唯一官方支持、项目级生效的方式。你得在项目根目录的 composer.json 里加配置:
{
"config": {
"vendor-dir": "lib/vendor"
}
}
注意三点:
-
vendor-dir值必须是相对路径,不能以/开头,也不能含..;"D:/vendor"或"../vendor"都不合法 - 父目录(如
lib/)得提前存在,Composer 不会自动创建上层目录 - 改完必须删掉旧
vendor目录,再跑composer install,否则旧文件残留会导致 autoload 错乱
用 COMPOSER_VENDOR_DIR 环境变量临时覆盖(适合 CI/CD)
想在 Docker、GitLab CI 或 Windows 批处理里动态指定位置,就用这个。它优先级高于 composer.json 里的配置:
- Linux/macOS:
COMPOSER_VENDOR_DIR=../shared/vendor composer install - Windows CMD:
set COMPOSER_VENDOR_DIR=..\shared\vendor && composer install - Dockerfile 中建议用
ENV COMPOSER_VENDOR_DIR=/app/third-party
⚠️ 注意:Web 环境(如 PHP-FPM)中该变量需在服务启动前注入,仅在 shell 里 export 是无效的。
改了路径后,哪些地方一定会出问题?
不是改个配置就完事了。以下几处不手动同步,必报错:
- 代码里
require 'vendor/autoload.php'得改成require 'lib/vendor/autoload.php' - 部署脚本或 Dockerfile 中所有硬编码的
vendor路径(比如COPY vendor/、rsync -av --exclude=vendor)都要检查 - IDE(如 PhpStorm)可能缓存旧路径,需手动刷新 External Libraries 或重置索引
-
vendor/bin下的命令(如phpunit)现在在lib/vendor/bin,PATH 或 CI 脚本调用要更新
真正麻烦的从来不是“怎么改”,而是改完之后整个工具链——autoload、bin、IDE、部署、协作——全都得对齐。稍漏一处,Class not found 或 Command not found 就立刻出现。










