vendor目录位置由composer.json中config.vendor-dir字段决定,仅认当前项目配置;设后所有install/update均生效,autoload自动适配,环境变量COMPOSER_VENDOR_DIR仅作fallback,全局config设置vendor-dir无效。

composer install 时 vendor 目录写在哪,由 composer.json 的 config.vendor-dir 决定
不是靠环境变量、全局配置或命令行参数临时指定的——它只认当前项目的 composer.json 里写的值。一旦设了 config.vendor-dir,所有 composer install 和 composer update 都会把包装进那个路径,连 autoload 生成的路径也会自动适配。
常见错误是改了 COMPOSER_VENDOR_DIR 环境变量却没生效:这个变量只在没有 config.vendor-dir 时才 fallback 生效,有配置项就直接忽略它。
- 在项目根目录的
composer.json中添加(或修改)"config": { "vendor-dir": "lib/vendor" } - 路径支持相对路径(推荐)和绝对路径;相对路径以项目根为基准,比如
"vendor-dir": "../shared/vendor"也合法 - 执行前确保目标父目录存在且可写,否则报错:
Could not create directory .../lib/vendor - 改完后必须运行
composer install(不是update)才能真正移动并重建 autoload
全局配置 composer config --global 对 vendor 路径无效
很多人想“一劳永逸”地改掉所有项目的 vendor 位置,于是跑 composer config --global vendor-dir /path/to/global/vendor —— 这个命令能成功执行,但完全不生效。Composer 的全局 config 只影响代理、仓库、插件等行为,vendor-dir 是明确禁止在全局 scope 设置的字段,源码里直接跳过。
如果你真需要跨项目统一管理依赖,正确做法是:用符号链接 + 固定项目级配置,或者用 COMPOSER_HOME 配合自定义安装脚本,而不是指望全局 config。
- 运行
composer config --global vendor-dir xxx后,再composer install依然走默认vendor/ - 检查是否生效?看
composer config vendor-dir(不带--global),它只读当前项目配置 - 误设全局 vendor-dir 不会报错,但会悄悄被忽略,容易让人误以为“已经改好了”
PHP 自动加载器(autoload)会自动适配新 vendor 路径,但硬编码路径的代码会崩
Composer 生成的 vendor/autoload.php 和类映射文件(如 vendor/composer/autoload_classmap.php)全基于你设的 vendor-dir 路径生成,所以 require 它之后,new SomePackage\Class 这类调用照常工作。
崩的是那些手动写死 require 'vendor/autoload.php' 或 include 'vendor/some/package/src/...' 的代码——它们不会跟着配置变,路径一改就 Warning: require(...): failed to open stream。
- 所有显式引用
vendor/的路径,都要同步改成你设的config.vendor-dir值,比如require 'lib/vendor/autoload.php' -
composer dump-autoload -o不影响路径逻辑,只优化加载性能,该崩还是崩 - IDE(如 PHPStorm)可能缓存旧 vendor 路径导致跳转失效,需要手动刷新索引或重新设置 Include Path










