Composer 官方已废弃 config.vendor-dir,唯一有效方式是设 COMPOSER_VENDOR_DIR 环境变量;它控制所有命令的 vendor 路径,但需同步更新 autoload 引用及工具配置。

Composer 没有“框架目录”这个概念,也没有官方支持的机制去把 Laravel、Symfony 等框架本身单独装进某个子目录;你真正能控制的,只有 vendor 目录位置和部分包(如 WordPress 插件)的安装路径。其他所谓“框架目录”的说法,基本是误读或 DIY 封装。
为什么 config.vendor-dir 不再起作用
自 Composer 2.0 起,config.vendor-dir 已被彻底废弃。你在 composer.json 里写 "vendor-dir": "lib/vendor",不仅不会生效,还会触发明确警告:
The "config.vendor-dir" option is deprecated, use the "COMPOSER_VENDOR_DIR" environment variable instead.
Composer 直接跳过该字段,继续把所有包装进默认的 vendor/。常见错误包括:
- 改完
composer.json就运行composer install,结果vendor还在原处 -
composer diagnose显示弃用警告但忽略它,后续 autoload 失败 - 以为删了旧
vendor再装就能迁移——其实根本没机会触发,因为配置早被无视了
唯一可靠方式:COMPOSER_VENDOR_DIR 环境变量
这是 Composer 官方当前唯一支持、全命令(install、update、require)一致识别的 vendor 路径控制方式,优先级高于任何项目配置。
- Linux/macOS 临时使用:
COMPOSER_VENDOR_DIR=third-party composer install - Windows CMD:
set COMPOSER_VENDOR_DIR=third-party && composer install - PowerShell:
$env:COMPOSER_VENDOR_DIR="third-party"; composer install - 永久生效:把
COMPOSER_VENDOR_DIR加进 shell 配置(如~/.zshrc)或系统环境变量,重启终端才加载
注意路径写法:
- 支持相对路径(
third-party)和绝对路径(/var/www/myapp/third-party)✅ - 禁用以
/开头的“伪绝对路径”(如/third-party)❌,Windows 下易解析失败
单包路径定制:extra.installer-paths + composer/installers
如果你想把 wordpress-plugin 装进 wp-content/plugins/,或把 drupal-module 放进 modules/contrib/,才轮到这个组合。它对普通 PHP 库(如 monolog/monolog)完全无效。
- 必须先执行:
composer require composer/installers - 配置写在
composer.json的extra.installer-paths字段下,例如:
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"modules/contrib/{$name}/": ["type:drupal-module"]
}
}
关键限制:
- 只匹配包的
type字段,不是包名或 vendor 名 - 规则按顺序匹配,只取第一个命中项,不叠加
- 已安装的包不会自动迁移,必须删掉
vendor后重装 - 路径值是相对于项目根目录的,不能以
/开头
autoload 和脚本调用会出问题吗
会。设置 COMPOSER_VENDOR_DIR 只改变包的物理存放位置,不自动更新以下内容:
-
vendor/autoload.php的生成路径仍由 Composer 内部逻辑决定,但实际文件会出现在新路径下 - 你的代码里硬写的
require 'vendor/autoload.php'会失败,得同步改成新路径(如third-party/autoload.php) - IDE 的自动补全、PHPStan、Psalm 等工具可能仍按默认
vendor/查找类,需手动配置路径 - CI 脚本若未透传
COMPOSER_VENDOR_DIR,就会在默认位置找vendor,导致Class not found
最常被忽略的一点:改了 vendor 路径后,composer dump-autoload 生成的 autoloader 仍指向新路径下的 autoload.php,但如果你的 Web 服务器或 CLI 脚本没同步更新引用方式,就直接报错——这不是 Composer 的问题,是你自己的路径契约断了。











