Composer 2.0+ 已彻底废弃 config.vendor-dir,唯一可靠方式是环境变量 COMPOSER_VENDOR_DIR;设了 vendor-dir 会触发弃用警告且被忽略,vendor 仍装入默认目录。

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.
- 这不是“没生效”,而是被主动忽略——Composer 直接跳过该配置项
- 旧教程里复制的 JSON 片段
{"config": {"vendor-dir": "lib/vendor"}}在当前版本属于无效代码 -
composer diagnose会明确告诉你这条配置已废弃
怎么用 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 - Windows PowerShell:
$env:COMPOSER_VENDOR_DIR="third-party"; composer install - 永久生效:把
COMPOSER_VENDOR_DIR加进 shell 配置(如~/.zshrc)或系统环境变量,注意重启终端/IDE 才能加载 - 路径必须是相对路径(如
third-party)或绝对路径(如/var/www/myapp/third-party),但不要以/开头的“伪绝对路径”(如/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 等 IDE 默认只索引
vendor/,需手动在Settings → PHP → Include Paths中添加新路径 -
composer dump-autoload本身没问题,但它生成的autoload.php是基于当前COMPOSER_VENDOR_DIR值写的,所以必须确保该变量在运行时已正确设置
installer-paths 能不能用来换普通包的位置?
不能。它只对 type 明确为 wordpress-plugin、drupal-module 等非 library 类型的包生效;普通 PHP 库("type": "library")永远走 COMPOSER_VENDOR_DIR 指定的主目录。
- 先确认目标包在 Packagist 上声明的
type,比如wpackagist-plugin/akismet的 type 是wordpress-plugin - 必须已执行
composer require composer/installers,否则extra.installer-paths完全不触发 - 路径值是相对于项目根目录的,且必须以
/结尾,例如:"wp-content/plugins/{$name}/" - 别指望靠它把
monolog/monolog或symfony/console搬到别的目录——它们类型是library,不受控
真正容易被忽略的是:环境变量一旦设在项目级(如 .env 或 CI 脚本中),就必须确保所有环节——包括 Docker 构建阶段、部署脚本、本地开发终端、IDE 内置终端——都继承了这个变量;漏掉任意一环,就会出现“本地跑得通,CI 报 Class not found”这类问题。

















