composer 2.0+ 中 config.vendor-dir 已被彻底移除,设了无效且触发警告;唯一可靠方式是环境变量 composer_vendor_dir,它优先级最高、全命令生效,但需同步更新 autoload 引用及工具配置。

Composer 2.0+ 中,config.vendor-dir 已被彻底废弃,设了不仅无效,还会触发弃用警告;唯一可靠、全命令生效的方式是环境变量 COMPOSER_VENDOR_DIR。
为什么 config.vendor-dir 不再起作用
自 Composer 2.0 起,config.vendor-dir 字段被移除。你在 composer.json 里写:{"config": {"vendor-dir": "lib/vendor"}}
执行 composer install 后,vendor 仍会出现在默认的 vendor/ 目录下,并抛出明确警告:The "config.vendor-dir" option is deprecated, use the "COMPOSER_VENDOR_DIR" environment variable instead.
这不是“没生效”,而是 Composer 主动跳过该配置项。运行 composer diagnose 也会直接指出这条配置已废弃。
- 它不参与任何命令路径决策(
install、update、dump-autoload全部无视) - 即使和
COMPOSER_VENDOR_DIR共存,也会被后者覆盖(但更常见的是:环境变量未设,而配置又失效,结果 vendor 还在原地) - 旧教程里复制的 JSON 片段,在当前(2026 年最新版 2.5+)属于无效代码
怎么正确用 COMPOSER_VENDOR_DIR 指定路径
这个环境变量优先级最高,对 install、update、require 全部生效,且无需改项目配置。
- 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 - 永久生效:加到
~/.zshrc(macOS/Linux)或系统环境变量(Windows),注意重启终端或 IDE 才能加载
路径可以是相对路径(如 third-party)或绝对路径(如 /var/www/myapp/third-party),但避免以 / 开头的“伪绝对路径”(如 /third-party),否则 Windows 下可能解析异常。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
注意:COMPOSER_VENDOR_DIR 只控制安装位置,不自动修复你的代码引用、IDE 设置或 CI 脚本——这是最容易翻车的地方。
改完路径后 autoload.php 为什么还报错
因为 COMPOSER_VENDOR_DIR 只决定文件写入位置,不改变你代码里硬编码的路径。典型错误现象:Fatal error: require(): Failed opening required 'vendor/autoload.php'
-
require 'vendor/autoload.php'必须手动改成require 'third-party/autoload.php'(相对路径)或用动态方式:$vendorDir = getenv('COMPOSER_VENDOR_DIR') ?: 'vendor'; require __DIR__ . "/../{$vendorDir}/autoload.php"; -
vendor/bin/phpunit要同步改为third-party/bin/phpunit,CI 脚本、$PATH、Makefile 里所有硬编码都得扫一遍 - PHPStorm 等 IDE 默认只索引
vendor/,需手动在Settings → PHP → Include Paths中添加新路径 -
composer dump-autoload本身没问题,但它生成的autoload.php是基于当前COMPOSER_VENDOR_DIR值写的,所以必须确保该变量在运行时已正确设置
想只挪某个包(比如前端库)而不是整个 vendor
这时候别碰 COMPOSER_VENDOR_DIR —— 它是全局开关。你要的是按包粒度控制,得用 davidbarratt/custom-installer 插件 + extra.custom-installer 规则。
- 先装插件:
composer require davidbarratt/custom-installer:^1.0(必须放require,不能放require-dev) - 在
composer.json的extra下加规则,例如:"custom-installer": { "library": "public/js/libs/", "my-org/my-lib": "app/extensions/my-lib/" } -
library是目标包composer.json中声明的type字段值;my-org/my-lib是完整包名,优先级高于type匹配 - 如果目标包没声明
type,规则不生效——你得 fork 它,在它的composer.json里补上"type": "library"再发布
这种方案和 COMPOSER_VENDOR_DIR 完全不冲突,一个管“容器位置”,一个管“包落点”。但要注意:它只对安装阶段生效,不会重写已有包,首次使用务必清空 vendor/ 后重装。










