默认装到项目根目录的 vendor/ 文件夹;可通过 composer.json 中 config.vendor-dir 配置改为相对路径(如 "libs"),需删旧 vendor 后运行 composer install 生效,环境变量和运行时参数均无效。

composer install 默认装到哪里?
默认情况下,composer install 总是把包解压到项目根目录下的 vendor/ 文件夹里,不会理你当前在哪个子目录、也不会读取环境变量或配置来改路径。这个行为由 composer.json 中的 "vendor-dir" 配置项控制——但注意:它只对当前项目生效,且必须写在项目自己的 composer.json 里,不是全局设置。
怎么让 composer 把包装进自定义目录?
唯一可靠的方式是在项目根目录的 composer.json 中显式声明:"vendor-dir"。比如你想装到 libs/ 下:
{
"config": {
"vendor-dir": "libs"
}
}
然后运行 composer install(不是 update),它才会按新路径创建并填充包。如果之前已有 vendor/,得先手动删掉,否则 Composer 会跳过安装或报错。
-
vendor-dir值必须是相对路径(不能以/开头),且不能包含..向上跳转 - 该配置不支持通配符或变量,也不能用
$HOME这类 shell 变量 - 改完后所有依赖包、自动加载器(
autoload.php)、二进制命令(bin/)都会跟着挪过去,后续调用要同步更新引用逻辑
为什么 vendor-dir 改了却没生效?
常见原因就三个:
- 改的是全局
composer.json(比如~/.composer/composer.json)——没用,Composer 不读这个位置的vendor-dir - 运行的是
composer update而不是install,且vendor/目录还存在——Composer 会复用旧结构,忽略新配置 -
composer.json语法错误或没写在最外层"config"下,比如错写成"extra"或缩进不对,导致配置被静默忽略
验证是否生效:看 composer show --working-dir 输出的路径,以及执行后是否存在你指定的目录、里面有没有 autoload.php。
能不能不改 vendor-dir,临时换路径安装?
不能。Composer 没有类似 --target 或 -d 的运行时参数来覆盖 vendor 路径。试图用 COMPOSER_VENDOR_DIR 环境变量也无效——那是旧版 Composer(v1)才支持的,v2+ 已移除。硬要用脚本绕过,比如先 cp -r vendor/ custom/,只会导致自动加载器路径错乱、composer dump-autoload 失败,得不偿失。
真需要多目录管理,应该用 path 类型仓库或 repositories 配置本地包,而不是强行移动 vendor。










