可在composer.json中通过config.vendor-dir指定依赖目录名,如"vendor-dir": "lib",但需手动删除旧vendor目录并重装;环境变量composer_vendor_dir优先级更高;还需同步更新所有require 'vendor/autoload.php'为新路径。

composer.json 里用 config.vendor-dir 指定目录名
Composer 默认把依赖装进 vendor 目录,想改名字,最直接的方式是在项目根目录的 composer.json 里加配置项。不是全局改,是每个项目自己决定。
注意:这个配置只影响当前项目的 install 和 update 行为,不会动已有的 vendor 目录——如果目录已经存在且名字不对,得手动删掉再重装。
- 在
composer.json的config对象里加"vendor-dir": "lib"(比如你想叫lib) - 确保
config是顶层字段,不是嵌套在require或autoload里 - 改完后运行
composer install,它会新建指定目录并装包;已有vendor不会自动重命名或迁移 - 如果用了
composer dump-autoload或自动加载相关命令,它们会读新路径,但前提是vendor-dir已生效且目录已生成
环境变量 COMPOSER_VENDOR_DIR 优先级更高
命令行临时换目录、CI/CD 流水线里隔离依赖、或者测试不同结构时,用环境变量比改 JSON 更灵活。它的优先级高于 composer.json 里的 vendor-dir,只要设置了,就以它为准。
常见错误现象:composer install 还是往 vendor 写,说明环境变量没生效,或者被 shell 配置覆盖了。
- Linux/macOS:运行前加
COMPOSER_VENDOR_DIR=ext composer install - Windows cmd:用
set COMPOSER_VENDOR_DIR=ext && composer install - PowerShell:用
$env:COMPOSER_VENDOR_DIR="ext"; composer install - 该变量只对当次命令有效;写进 CI 脚本时注意作用域,别漏了
export(bash)或等效操作
改了 vendor 目录名,autoload.php 路径要同步更新
绝大多数项目通过 require 'vendor/autoload.php' 加载类,目录名一变,这行就会报 failed to open stream 错误。这不是 Composer 的问题,是你代码里写死了路径。
不能只改安装位置,不改引用方式。尤其要注意框架入口文件(如 Laravel 的 public/index.php、Symfony 的 public/index.php)和单元测试引导文件。
- 搜索整个项目,把所有
vendor/autoload.php替换成新路径,比如lib/autoload.php - 如果用了 Composer 的自动加载机制(如 PSR-4),
autoload.php本身是自动生成的,不用改内容,只改 require 路径 - 某些工具(如 PHPUnit)可能在配置里硬编码了
vendor,检查phpunit.xml或phpunit.xml.dist里的bootstrap字段
composer global 不受项目级 vendor-dir 影响
全局命令(如 composer global require laravel/installer)永远装在 ~/.composer/vendor/(Linux/macOS)或 %USERPROFILE%\AppData\Roaming\Composer\vendor\(Windows),改项目里的 vendor-dir 完全无效。
想统一管理全局依赖的位置?目前没有官方支持。强行软链或改环境变量风险高,容易导致 composer global update 失败或命令找不到。
- 全局安装的工具,路径是固定的,别指望用
config.vendor-dir动它 - 如果真需要隔离,建议用
composer create-project拉完整项目,而不是依赖全局命令 - CI 场景下,避免用
global require,优先用项目级require --dev+ script 调用
真正麻烦的不是改名字,而是所有显式引用 vendor 的地方都要跟着动——包括文档、部署脚本、IDE 配置、甚至某些静态分析工具的路径白名单。一个没扫到,就卡在 autoload 上。










