vendor-dir 是唯一控制依赖安装路径的配置,必须在 composer.json 的 config 字段下设为相对路径,改后需删除旧 vendor 并重装;COMPOSER_VENDOR_DIR 环境变量在 Composer 2.x 中已失效。

离线包路径不是 Composer 的配置项,它没有“离线包路径”这个概念;你真正想配的,是 vendor-dir——即依赖最终解压、安装到哪里。所有所谓“离线包路径”的困惑,都源于混淆了下载缓存(COMPOSER_HOME/cache)和安装目标(vendor)。
config.vendor-dir 是唯一生效的安装路径配置
Composer 2.x 中,只有项目级 composer.json 里的 config.vendor-dir 能控制依赖安装位置,且必须满足三个硬性条件:
- 写在
composer.json最外层config字段下,不能嵌套进extra或缩进错位 - 值必须是相对路径(如
"lib/vendor"),不能以/开头,不支持环境变量或通配符 - 执行
composer install前,旧vendor目录必须已删除;composer update不会迁移已有包
示例配置:
{
"config": {
"vendor-dir": "lib/vendor"
}
}
配完立刻删掉现有 vendor,再运行 composer install,否则无效。
COMPOSER_VENDOR_DIR 环境变量在 2.x 已彻底失效
网上大量教程说设 COMPOSER_VENDOR_DIR=lib/vendor 就能改路径,这是过时信息。Composer 2.0+ 已移除对该变量的支持——它被完全忽略,不报错、不警告、也不生效。
验证方法:设完变量后运行 composer diagnose,如果输出里没出现 COMPOSER_VENDOR_DIR 相关提示,说明它根本没被读取。别再把它写进 CI 脚本或 .env 文件里。
改了 vendor-dir 后 autoload.php 找不到类?
不是 Composer 没装对,而是你的代码还在 require 原路径:
- 错:
require 'vendor/autoload.php'; - 对:
require __DIR__ . '/lib/vendor/autoload.php';(推荐,路径动态计算) - 或硬编码:
require 'lib/vendor/autoload.php';
还要同步检查:
-
bin-dir是否也配了(如"bin-dir": "lib/vendor/bin"),否则phpunit这类命令找不到 - IDE(如 PHPStorm)是否手动添加了新路径到 PHP → Include Paths
-
.gitignore是否更新,避免误提交新目录
缓存路径(cache)和安装路径(vendor)是两回事
你可能真正想要的是“离线可用”,那应该关注缓存目录,而不是改 vendor-dir:
- 缓存默认在
COMPOSER_HOME/cache(通常是~/.composer/cache) - 它存放下载的 zip/tar 包和 dist 包元数据,不影响
vendor位置 - 要离线安装,先在线跑一次
composer install --no-scripts,缓存就存好了;之后断网也能装,只要不换平台或 PHP 版本
缓存路径可安全用 COMPOSER_HOME 环境变量改,但它和 vendor-dir 完全无关——改了 COMPOSER_HOME 不会改变依赖最终解压到哪。
最常被忽略的一点:改完 vendor-dir 后,所有 CI 脚本、Dockerfile COPY 指令、部署 rsync 排除规则、甚至 PHPUnit 的 --bootstrap 参数,都得手工检查一遍。没人自动帮你全局替换字符串。











