composer 2.x 已弃用 config.vendor-dir 字段,仅通过环境变量 composer_vendor_dir 生效;全局镜像需加 --global 参数;插件不兼容需升级或移除;替换包后须补全实现并更新 autoload 映射。

Composer 2.x 会自动忽略废弃的 config.vendor-dir 字段
升级到 Composer 2.0+ 后,你在 composer.json 里写的 "config": {"vendor-dir": "lib/vendor"} 不会报错,但也不会生效——它只会默默被跳过,并输出警告:The "config.vendor-dir" option is deprecated。这不是 bug,是明确弃用行为。
真正起作用的是环境变量 COMPOSER_VENDOR_DIR,它优先级最高,且不依赖任何配置文件。临时验证只需:
COMPOSER_VENDOR_DIR=./libs composer install
若 libs/ 目录被创建,说明路径逻辑通了;否则问题不在 Composer 配置,而在环境变量未设、拼写错误或被父 shell 覆盖。
- 别在
composer.json中保留vendor-dir字段——它已无意义,还可能误导后续维护者 - 全局统一路径?设
export COMPOSER_VENDOR_DIR="$HOME/.composer/vendor"到~/.bashrc或~/.zshrc,但注意 CI 环境需显式注入 - 项目级路径差异?用
.env+dotenv加载变量,或直接在部署脚本中env COMPOSER_VENDOR_DIR=... composer install
composer config --global 写错作用域会导致镜像/路径配置静默失效
运行 composer config repos.packagist composer https://mirrors.aliyun.com/composer/(漏掉 --global)时,它会把配置写进当前项目的 composer.json 的 repositories 字段里。而这个字段默认被忽略,除非你同时加了 "packagist.org": false —— 所以你以为换了镜像,实际还在走官方源。
正确做法是先确认当前生效配置:
composer config --global --list | head -n 5
再执行全局镜像设置:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer config --global repos.packagist composer https://mirrors.aliyun.com/composer/
-
cache-dir、data-dir等路径类配置受COMPOSER_HOME控制,不是~/.composer—— 设错COMPOSER_HOME会导致缓存、日志、全局 bin 全部错位 - 项目级
composer.json中若存在"repositories"块,它永远优先生效,--global配置会被完全绕过 - 改完配置必须
composer clear-cache,否则旧元数据继续干扰解析,换源后仍拉不到包是缓存没清的典型表现
废弃插件残留引发的 Plugin X is not compatible with Composer 2 报错
升级后出现这个错误,不是 Composer 坏了,而是某个插件的 composer.json 里还写着 "composer-plugin-api": "^1.0"。Composer 2.x 只认 "^2.0",不兼容就直接拒绝加载。
第一步永远是诊断:
composer diagnose
它会高亮列出所有不兼容插件。接着查该插件是否已更新:
composer show vendor/plugin-name | grep "composer-plugin-api"
- 如果输出
composer-plugin-api: ^2.0,说明作者已适配,直接composer update vendor/plugin-name即可 - 如果输出为空或仍是
^1.0,且 Packagist 页面显示abandoned(如hirak/prestissimo),果断composer remove hirak/prestissimo - 别用
composer self-update --rollback——这个命令根本不存在;降级唯一合法方式是composer self-update --1,但仅限紧急救火,长期用 1.x 有安全风险
废弃包替换后 autoload 映射断裂比代码报错更难排查
你按提示把 monolog/monolog 换成 psr/log,结果 Class 'PsrLogLoggerInterface' not found。这不是 Composer 没装对,而是 psr/log 只提供接口,不提供实现——你得额外 composer require monolog/monolog 或 php-di/php-di 这类实现者。
更隐蔽的问题是命名空间映射变更。比如从 old-lib 切到 new-sdk,两者的 autoload 配置可能完全不同:
- 旧包
composer.json是"psr-4": {"Old\": "src/"},新包却是"psr-4": {"New\Sdk\": "src/"}——use OldUtil必须改成use NewSdkUtil - 即使命名空间一致,也要跑
composer dump-autoload -o,否则autoload_psr4.php里还缓存着旧映射 - IDE(如 PHPStorm)可能仍索引旧
vendor/目录,需手动 Reload project from Disk 或清空索引缓存
最易被忽略的是:Composer 的“纠错”只发生在下载和安装环节,它不会检查你代码里 new OldUtil() 是否该改成 new NewSdkUtil() —— 那是你的事,不是它的事。










