最稳妥方式是在 composer.json 中配置 config.vendor-dir 为相对路径(如 "lib/vendor"),需确保父目录存在;环境变量 COMPOSER_VENDOR_DIR 可临时覆盖,全局配置不推荐;路径变更后必须执行 composer install/update 以重新生成 autoload.php。

composer.json 里用 config.vendor-dir 指定路径最稳妥
这是官方支持且项目级生效的方式,修改后所有 composer install 和 composer update 都会把包装到新位置。直接在项目根目录的 composer.json 中加配置:
{
"config": {
"vendor-dir": "lib/vendor"
}
}
注意:vendor-dir 值必须是相对路径(不能以 / 开头),且不能包含 .. 回退;Composer 不会自动创建父目录,lib/ 得提前存在,否则报错 Could not create directory。
用 COMPOSER_VENDOR_DIR 环境变量临时覆盖
适合 CI/CD 或多环境切换场景,优先级高于 composer.json 里的配置。执行命令前设置即可:
COMPOSER_VENDOR_DIR=./packages composer install
Windows 下用 set COMPOSER_VENDOR_DIR=.\packages(cmd)或 $env:COMPOSER_VENDOR_DIR=".\packages"(PowerShell)。该变量只影响当前命令,不写入配置,也不影响其他项目。
全局配置 composer config -g 一般不推荐
运行 composer config -g vendor-dir /path/to/global/vendor 会修改全局 ~/.composer/config.json,导致所有项目默认走这个路径。问题在于:
- 不同项目可能需要不同结构(比如有的要和
src平级,有的要嵌套进third-party) - 团队协作时容易因全局配置不一致引发
vendor路径错乱、自动加载失败 -
autoload生成的vendor/autoload.php路径硬编码在vendor/composer/autoload_*.php里,换路径后旧 autoload 文件不会自动更新
改完路径后必须重新生成 autoload,否则 class not found
Composer 不会自动重写 vendor/autoload.php 的内部路径逻辑。只要 vendor-dir 变了,就得强制刷新自动加载器:
- 删掉旧
vendor目录(如果还存在) - 运行
composer dump-autoload不够——得跑完整composer install或composer update - 检查新
vendor/autoload.php文件头是否指向正确路径,比如require __DIR__ . '/lib/vendor/composer/autoload_real.php';
漏掉这步,哪怕文件都下载对了,require 'vendor/autoload.php' 仍会因路径错误导致类加载失败。










