config.vendor-dir是唯一真正生效的配置项,必须写在项目根目录composer.json中、值为相对路径、且需先删除旧vendor再执行composer install;否则install/update仍写入默认vendor/,autoload.php路径硬编码不变,类加载必然失败。

config.vendor-dir 是唯一真正生效的配置项
想改 vendor 目录名,别折腾 COMPOSER_VENDOR_DIR 或 -d 参数——它们在 Composer 2.2+ 中只对 dump-autoload 等少数命令有效,install 和 update 仍会往默认 vendor/ 写文件,且生成的 autoload.php 里硬编码的路径也不变。
config.vendor-dir 是 Composer 唯一全命令一致识别的路径控制方式,被 install、update、require 全部支持。但它有三个硬约束:
- 必须写在项目根目录的
composer.json里,子目录或全局配置无效 - 值必须是相对路径(如
"lib"✅,/var/lib或../lib❌) - 仅在
vendor/目录不存在时才起作用;已有目录不会迁移,也不会被覆盖
必须手动删除旧 vendor 并重运行 install
常见翻车:先 composer install 生成了默认 vendor/,再补加 "vendor-dir": "lib" —— 此时改完没用,Composer 完全忽略新配置。
正确流程只有一步:删掉现有 vendor 目录(或重命名备份),再执行 composer install(不是 update,后者不读取该配置)。否则你会看到:
-
Could not delete vendor/autoload.php(Composer 试图清理旧路径但失败) - 新包装进
lib/,但旧autoload.php还在vendor/下,类加载直接报错 -
git status显示vendor/被删、lib/新增,但部署脚本若仍引用vendor/就炸了
所有显式引用 vendor/autoload.php 的地方都要同步改
Composer 不会自动更新代码里硬写的路径。如果你设了 "vendor-dir": "lib",但还留着 require 'vendor/autoload.php',PHP 就会报 failed to open stream: No such file or directory。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
需要人工检查并修改的点包括:
- 入口文件(如
index.php、cli.php)中的require语句 -
composer.json里的scripts(比如post-install-cmd中调用php vendor/bin/phpunit得改成php lib/bin/phpunit) -
.gitignore中的/vendor行,要换成/lib(否则新目录会被提交) - CI/CD 脚本、Dockerfile、部署工具中所有出现
vendor字符串的地方
IDE 和静态分析工具可能不认新路径
PHPStorm、Psalm、PHPStan 这些工具默认扫描 vendor/ 目录做索引和类型推导。改成 lib/ 后,它们大概率继续报“未解析的符号”或“类未找到”,哪怕运行时完全正常。
解决办法不是妥协,而是主动适配:
- PHPStorm:File → Settings → PHP → Include paths,手动添加
lib/ - Psalm:在
psalm.xml中调整<autoloader></autoloader>路径,或确保composer dump-autoload --classmap-authoritative生成的映射被正确读取 - Docker 构建:避免用
COPY . /app后再RUN composer install,而应把vendor-dir配置和composer.lock一起纳入构建上下文,防止本地和容器路径不一致
最麻烦的其实是团队协作:一个人改了 vendor-dir,其他人没同步更新 IDE 配置或 CI 脚本,问题就藏在暗处,直到某次部署失败才暴露。










