
Composer 支持通过 config.vendor-dir 配置或 COMPOSER_VENDOR_DIR 环境变量自定义依赖安装路径,需删除旧 vendor 目录并更新 autoload.php 路径,避免使用软链接导致路径不一致、类加载失败及 IDE 索引异常等问题。
Composer 默认把依赖包装进 vendor 目录,但你完全可以用自定义路径替代它

composer install 和 composer update 原生写入新目录。
composer.json 中的 config.vendor-dir
这是最直接、最推荐的方式。在项目根目录的 composer.json 文件中添加或修改 config 字段:
{
"name": "my/project",
"type": "project",
"config": {
"vendor-dir": "lib/vendor"
}
}
之后执行 composer install 或 composer update,所有包就会被安装到 lib/vendor 而非默认的 vendor。注意:vendor-dir 必须是相对路径(不以 / 开头),且不能包含 .. 向上跳转。
vendor 目录,先手动删掉它,否则 Composer 可能跳过重装autoload 逻辑仍指向新路径,尤其是 require 'vendor/autoload.php' 这类硬编码要同步改成 require 'lib/vendor/autoload.php'
vendor-dir 不影响 Packagist 元数据解析,只改变本地落地位置COMPOSER_VENDOR_DIR
适合 CI/CD 流水线或临时调试场景,优先级高于 composer.json 配置:
COMPOSER_VENDOR_DIR=third-party composer install
该命令会把依赖装进 third-party 目录。这个变量对当前 shell 会话生效,不影响其他命令;也可写入 .env 或 CI 配置中。
set COMPOSER_VENDOR_DIR=third-party(CMD)或 $env:COMPOSER_VENDOR_DIR="third-party"(PowerShell)config.vendor-dir 和环境变量,环境变量胜出autoload.php 路径仍需显式指定vendor 目录?有人试图 mv vendor lib/vendor && ln -s lib/vendor vendor,这会导致几个隐性问题:
installed.json 里记录的是真实路径(lib/vendor),但部分插件或脚本可能依赖 getcwd() . '/vendor' 硬编码,行为不一致composer dump-autoload --optimize 生成的类映射可能缓存旧路径,引发 Class not found
vendor 目录名做索引,软链可能导致类型提示失效真正需要重命名 vendor 路径时,就老实用 config.vendor-dir 或环境变量。别绕路,也别指望 Composer 会自动“猜”你改了名字。