config.vendor-dir 在 composer 2.0+ 已彻底废弃,不生效且触发弃用警告;唯一可靠方式是设置环境变量 composer_vendor_dir,它优先级最高,对 install、update、require 等所有命令均生效。

直接说结论:config.vendor-dir 在 Composer 2.0+ 已完全失效,写进 composer.json 不仅不生效,还会触发弃用警告;真正可靠、全命令生效的方式只有环境变量 COMPOSER_VENDOR_DIR。
为什么 config.vendor-dir 不再管用
Composer 2.0+ 主动移除了对 config.vendor-dir 的支持。它不是“偶尔失灵”,而是被代码层面跳过——即使你保留该配置,composer install 仍会照常把包装进 vendor/,同时报出明确警告:
The "config.vendor-dir" option is deprecated, use the "COMPOSER_VENDOR_DIR" environment variable instead.
运行 composer diagnose 也会提示该配置已废弃。旧教程里复制的 JSON 片段,在当前版本属于无效代码。
- 它只在 vendor 目录不存在时“尝试生效”,但 Composer 2.x 根本不读这一项
- 哪怕 vendor 目录为空,
config.vendor-dir也完全不会影响路径 - 项目级
composer.json中的config字段,本就不支持vendor-dir——这是硬性限制,不是 bug
COMPOSER_VENDOR_DIR 怎么设才有效
COMPOSER_VENDOR_DIR 是唯一被官方文档明确推荐、且对所有命令(install、update、require)都生效的机制。它优先级最高,不依赖项目配置是否存在。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Linux/macOS:运行前临时设置,
COMPOSER_VENDOR_DIR=third-party composer install - Windows CMD:
set COMPOSER_VENDOR_DIR=third-party && composer install - PowerShell:
$env:COMPOSER_VENDOR_DIR="third-party"; composer install - 路径可为相对路径(如
third-party)或绝对路径(如/var/www/myapp/libs) - 避免用以
/开头的“伪绝对路径”(如/third-party),Windows 下可能解析失败 - 永久生效需写入 shell 配置(如
~/.zshrc)或系统环境变量,并重启终端/IDE
installer-paths 能不能把普通包装到指定目录
不能。它只对声明了特定 type 字段、且该类型被 composer/installers(或类似插件)识别的包生效。普通 library 类型包(如 monolog/monolog)完全不匹配。
- 必须先
composer require composer/installers(v2.x 推荐) - 目标包自身
composer.json中得有"type": "wordpress-plugin"这类字段 - 配置必须写在根项目
composer.json的extra.installer-paths下,格式严格 - 改完后必须删掉整个
vendor/和composer.lock,再跑composer install—— 它不会重排已有包 - 常见支持类型包括:
wordpress-plugin、drupal-module、laravel-library、symfony-bundle(需 v2+)
改路径后哪些地方容易崩
改了安装路径,最常出问题的不是 Composer 本身,而是后续链路没同步更新:
-
require 'vendor/autoload.php'必须改成新路径,比如require 'third-party/autoload.php' - IDE(如 PHPStorm)默认只索引
vendor/,需手动在Settings → PHP → Include Paths中添加新路径 -
bin-dir默认指向vendor/bin/,如果用了COMPOSER_VENDOR_DIR,就得同步确保脚本调用的是third-party/bin/phpunit等 - CI/CD 脚本中硬编码的
vendor/bin/*路径全部要改,否则部署后命令直接报错 - 某些静态分析工具(如 PHPStan)、Xdebug 路径映射、Docker COPY 指令,也可能因路径名变化而失效
最麻烦的点在于:这些改动不是一次性的,而是散落在代码、配置、工具链、部署流程中,漏掉任意一个,就会出现“类找不到”或“命令未找到”的静默失败。










