不能靠项目级 composer.json 配置实现公共 vendor 目录,必须用 composer_home/config.json 全局配置或 composer_vendor_dir 环境变量;vendor-dir 在项目 composer.json 中被 composer 明确跳过,非 bug 而是设计限制。

不能靠项目级 composer.json 配置实现公共 vendor 目录——这是 Composer 的硬性限制,必须用全局配置或环境变量。
为什么 config.vendor-dir 在项目里写没用
你在项目 composer.json 里写 "vendor-dir": "/shared/vendor",执行 composer install 后依然生成 vendor/ 目录,不是配置错了,是根本不会读。Composer 明确禁止在项目级配置中解析 vendor-dir,它只在全局或系统级生效。
- 错误现象:
"config": {"vendor-dir": "lib"}写进项目composer.json,运行后vendor/照旧,且无任何警告 - 真正起作用的位置只有两个:
$COMPOSER_HOME/config.json(推荐)或/etc/composer/config.json(系统级) - 项目级
composer.json中的config字段会被加载,但vendor-dir字段被直接跳过——这不是 bug,是设计如此
用 COMPOSER_HOME + config.json 实现共享 vendor
这是最稳定、可复现的公共依赖路径方案,所有项目共用一个 vendor 目录,避免重复下载和磁盘浪费。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先设置环境变量:
export COMPOSER_HOME="/opt/my-composer"(Linux/macOS)或setx COMPOSER_HOME "D:\my-composer"(Windows) - 确保该目录存在,并在其中创建
config.json,内容为:{"config": {"vendor-dir": "/opt/shared-vendor"}} - 验证是否生效:
composer config --global vendor-dir应输出/opt/shared-vendor - 注意:
COMPOSER_HOME影响的是 Composer 自身配置、缓存、全局 bin,而config.json才真正接管vendor-dir;单设前者不设后者,vendor还是落在项目里
更灵活:用 COMPOSER_VENDOR_DIR 环境变量覆盖
适合 CI/CD 或多环境部署场景,无需改全局配置,优先级高于 config.json 中的 vendor-dir。
- 临时生效:
COMPOSER_VENDOR_DIR=/data/vendor composer install - 永久生效(如 GitHub Actions):
env: COMPOSER_VENDOR_DIR: /data/vendor
- 该变量会完全忽略
composer.json和config.json中的vendor-dir设置 - 风险点:你得手动确保所有项目都正确引入
/data/vendor/autoload.php,否则Class not found错误会静默出现
别踩 symlink 的坑:IDE 和脚本依赖真实路径
有些工具(PHPStan、Xdebug 路径映射、某些 IDE 的自动索引)强依赖 vendor/ 这个字面目录名。这时不能真删掉它,而是保留空 vendor/ 并指向公共路径。
- 操作顺序必须是:
rm -rf vendor && ln -s /opt/shared-vendor ./vendor - 符号链接目标路径必须已存在、权限可读,且其内容与当前
composer.lock版本严格匹配 - PHPStorm 等 IDE 可能缓存旧 vendor 路径,需手动触发
File > Reload project或清空索引 -
composer dump-autoload不会重新生成 symlink,它只读取当前vendor/下的结构——所以 symlink 必须在install或update后立即建立
真正难的不是怎么设路径,而是让所有环节——自动加载、bin 脚本调用、IDE 索引、CI 构建、Xdebug 映射——全部对齐到同一个物理位置。漏掉任意一环,都会表现为“类存在但找不到”或“命令提示 command not found”。










