composer 2.0+ 已彻底废弃 config.vendor-dir,唯一可靠且全命令生效的方式是环境变量 composer_vendor_dir;它优先级最高,支持相对/绝对路径,但需同步更新 autoload 引用、ide 索引及所有硬编码路径。

Composer 2.0+ 已彻底废弃 config.vendor-dir,现在唯一可靠、全命令生效的方式是环境变量 COMPOSER_VENDOR_DIR;任何在 composer.json 里写 "vendor-dir" 的做法不仅无效,还会触发弃用警告并被忽略。
为什么改了 composer.json 的 vendor-dir 没反应?
这不是配置没读到,而是 Composer 主动跳过它。自 2.0 起,config.vendor-dir 被完全移除,你加了它,composer install 会照常执行,但 vendor 仍落在默认 vendor/ 下,并抛出明确警告:The "config.vendor-dir" option is deprecated, use the "COMPOSER_VENDOR_DIR" environment variable instead.
- 旧教程里复制的
{"config": {"vendor-dir": "lib/vendor"}}在当前版本属于无效 JSON 片段 -
composer diagnose会直接告诉你这条配置已废弃 - 即使你删了旧
vendor/并重跑composer install,它也完全不认这个字段
怎么正确用 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 - Dockerfile 推荐:
ENV COMPOSER_VENDOR_DIR=/app/deps,避免污染镜像 - 路径可为相对(
third-party)或绝对(/var/www/myapp/deps),但不要以/开头的“伪绝对路径”(如/third-party),否则 Windows 下可能解析失败
改完路径后 autoload 和 bin 为什么还报错?
COMPOSER_VENDOR_DIR 只控制安装位置,不自动修复你的代码引用、IDE 设置或脚本调用。
-
require 'vendor/autoload.php'必须手动改成require 'third-party/autoload.php',或改用动态拼接:require __DIR__ . '/third-party/autoload.php'; -
vendor/bin/phpunit要同步改为third-party/bin/phpunit,CI 脚本、$PATH、Makefile 里所有硬编码都得扫一遍 - PHPStorm 默认只索引
vendor/,需手动在Settings → PHP → Include Paths中添加新路径 -
composer dump-autoload本身没问题,但它生成的autoload.php是基于当前COMPOSER_VENDOR_DIR值写的——所以必须确保该变量在运行时已正确设置
installer-paths 能不能用来换普通包的位置?
不能。它只对声明了特定 type 的包生效(如 wordpress-plugin、drupal-module),且必须启用 composer/installers 插件。
- 前提:先运行
composer require composer/installers - 在
composer.json的extra字段下配installer-paths,例如:{"wp-content/plugins/{$name}/": ["type:wordpress-plugin"]} - 路径值是相对于项目根目录的,不能以
/开头;{$name}会被替换成包名(不含 vendor 部分) - 普通库(
type: library)完全不受影响,哪怕你写了规则也进不了指定目录
最易被忽略的一点:Web 环境(如 PHP-FPM、Apache mod_php)中,COMPOSER_VENDOR_DIR 必须在 Web 服务器启动前注入,不能只在 shell 里 export —— 否则 PHP 进程根本读不到这个变量,类加载照样失败。










