composer 2.x 不支持 composer.json 中直接设置 vendor-dir,仅可通过环境变量 composer_vendor_dir 或项目级 config 命令配置;路径须为绝对路径或相对于项目根的相对路径,且 autoload.php 引用需同步更新。

composer.json 里不能直接设 vendor 路径
很多人想在 composer.json 里加个字段比如 "vendor-dir" 来改安装位置,但 Composer 从 2.0 开始已移除该配置项。硬写进去不会生效,也不会报错,只会默默忽略——这是最容易踩的坑。
真正可控的方式只有两种:命令行参数或全局配置。优先推荐命令行,因为项目级更明确、不污染环境。
用 --working-dir 和 --no-cache 组合指定路径
实际操作中,composer install 本身不接受 --vendor-dir,但你可以通过切换工作目录 + 修改 COMPOSER_VENDOR_DIR 环境变量来实现效果。关键点是:路径必须是绝对路径,且目录需存在(Composer 不会自动创建父级)。
- Linux/macOS:
COMPOSER_VENDOR_DIR=/path/to/my-vendor composer install --working-dir=/path/to/project - Windows PowerShell:
$env:COMPOSER_VENDOR_DIR="D:\my-project\vendor"; composer install --working-dir="D:\my-project" - 注意:
--working-dir指向的是含composer.json的目录,不是 vendor 目标位置
用 config 命令设置项目级 vendor 路径
如果你希望每次运行 composer install 都走自定义路径,又不想每次都输环境变量,可以在项目根目录执行:
composer config vendor-dir "libs/vendor"
这条命令会把配置写入项目级 composer.json 的 config 字段,生成类似这样的结构:
"config": {
"vendor-dir": "libs/vendor"
}
⚠️ 注意:这个 vendor-dir 是 Composer 1.x 的遗留字段,在 2.x 中仅对本地 config 有效(即只影响当前项目),且必须是相对路径(相对于 composer.json 所在目录)。它不支持环境变量展开,也不能用 ../ 跳出项目根。
autoload 自动加载会受 vendor 路径变动影响
路径一变,vendor/autoload.php 的位置就变了,所有 require 或 include 它的地方都要同步更新。常见错误是硬编码路径,比如:
require 'vendor/autoload.php'; // 错!路径已改
更稳妥的做法是:
- 用 Composer 自动生成的
vendor/autoload.php的实际路径(可通过composer config vendor-dir查到) - 或改用
__DIR__ . '/libs/vendor/autoload.php'这类相对引用 - 如果用了 PSR-4 自动加载,还要确认
composer.json里的autoload配置没依赖 vendor 下的路径(一般不会,但自定义 classmap 时可能误引)
路径改得越深,后续迁移和 CI 构建时越容易漏掉 autoload 引用点——这点常被忽略,直到部署时报 Class not found 才回头查。











