Composer 忽略全局 vendor-dir 配置,仅读取项目 composer.json 中的 config.vendor-dir;修改后需手动删除旧 vendor 并重装依赖,且硬编码的 autoload 路径须同步更新。

每个项目必须独立配置 vendor-dir,不能靠全局 config;改完要手动删旧 vendor 并重装依赖,否则路径不生效。
为什么 composer config --global vendor-dir 没用
Composer 完全忽略全局设置的 vendor-dir。它只读取当前项目根目录下 composer.json 中的 config.vendor-dir 字段。执行 composer config --global vendor-dir /path 确实会把键值写进 ~/.composer/config.json,但源码里明确跳过该配置——LocalRepository::getVendorDir() 只解析项目级 JSON。
- 即使全局 config 里出现了
"vendor-dir": "xxx",composer install仍用默认./vendor - CI 环境(如 GitHub Actions)默认没有全局 config,直接 fallback 到
vendor/,导致路径错乱 - 多个项目混用同一全局路径,会造成 autoload 冲突或权限问题
项目级 config.vendor-dir 正确写法
必须在项目根目录的 composer.json 中显式声明,且路径需为相对或绝对路径。修改后不会自动迁移已有 vendor,得手动处理。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 支持相对路径:
"config": { "vendor-dir": "lib/vendor" }(推荐,可移植) - 支持绝对路径:
"config": { "vendor-dir": "/var/www/myapp/vendor" }(CI 中常用) - 改完立即运行
composer install或composer update,否则新路径不加载 - 已存在的
vendor/不会被删除或覆盖,必须先rm -rf vendor,否则旧文件残留、autoload 错乱
用 COMPOSER_VENDOR_DIR 临时覆盖(CI/CD 场景首选)
环境变量优先级高于 composer.json 配置,适合构建脚本中动态指定路径,无需修改代码。
- Linux/macOS/WSL:
export COMPOSER_VENDOR_DIR="$HOME/.cache/composer/vendor" && composer install - Windows PowerShell:
$env:COMPOSER_VENDOR_DIR="D:\composer\vendor"; composer install - 必须是绝对路径;
~和$HOME不解析,得展开成真实路径 - 该变量只对当前 shell 会话或单条命令有效,退出即失效
- CI 脚本中建议配合缓存策略,比如 GitHub Actions 的
actions/cache缓存$COMPOSER_VENDOR_DIR
容易被忽略的关键点
路径生效 ≠ 自动加载生效。Composer 生成的 vendor/autoload.php 会适配新路径,但如果你在项目中硬编码了 require 'vendor/autoload.php',而 vendor-dir 改成了 lib/vendor,就得同步改成 require 'lib/vendor/autoload.php' —— 这个细节常被跳过,导致本地跑通、CI 报 Class not found。

















