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 配置中。
- Windows 下使用
set COMPOSER_VENDOR_DIR=third-party(CMD)或$env:COMPOSER_VENDOR_DIR="third-party"(PowerShell) - 若同时设置了
config.vendor-dir和环境变量,环境变量胜出 - PHP 运行时不会自动感知该变量,
autoload.php路径仍需显式指定
为什么不要用符号链接或重命名 vendor 目录?
有人试图 mv vendor lib/vendor && ln -s lib/vendor vendor,这会导致几个隐性问题:
- Composer 的
installed.json里记录的是真实路径(lib/vendor),但部分插件或脚本可能依赖getcwd() . '/vendor'硬编码,行为不一致 -
composer dump-autoload --optimize生成的类映射可能缓存旧路径,引发Class not found - 某些 IDE(如 PHPStorm)按
vendor目录名做索引,软链可能导致类型提示失效 - Git 会跟踪软链接本身,而非目标内容,协作时容易遗漏实际依赖文件
真正需要重命名 vendor 路径时,就老实用 config.vendor-dir 或环境变量。别绕路,也别指望 Composer 会自动“猜”你改了名字。










