必须同步清空composer.json的require和require-dev字段并删除vendor与composer.lock,否则install仍会按残留声明解析依赖;仅删vendor或lock无效,因composer行为由composer.json驱动。

直接删 vendor 和 composer.lock 不等于重构成功,必须同步清理 composer.json 里的残留声明,否则 install 会照着旧依赖继续装。
为什么删了 vendor 还是报错?
Composer 的行为由 composer.json 驱动,不是 vendor 目录。你删掉 vendor 后再跑 composer install,它会读 composer.lock(如果还在)或退回到 composer.json 里找 require 和 require-dev —— 里面若还躺着已废弃的包,比如 "old-legacy-lib": "^1.2",就会立刻报 Your requirements could not be resolved 或 Package is not installed。
常见现象包括:
-
composer install报No lock file present,但你明明刚删过 —— 实际是composer.json里还有 require 条目,而你没删composer.lock就先跑了 install,新版 Composer 直接拒绝执行 - 报
Package old-legacy-lib is not installed,但你确认没手动装过 —— 它仍写在composer.json的require-dev里,且被某个脚本隐式引用 - CI 构建失败,本地却能过 ——
composer.lock没提交,或你本地残留了旧 lock,而 CI 用的是 clean 环境 + 当前composer.json
怎么安全清空所有历史依赖?
目标是让项目回归“零依赖”状态,只保留你当前真正需要的包。操作顺序不能错:
- 备份原
composer.json:cp composer.json composer.json.bak - 清空
require和require-dev字段内容(留空数组,不是删字段):{"require": {}, "require-dev": {} } - 删掉
vendor/目录:rm -rf vendor - 删掉
composer.lock:rm composer.lock - 运行
composer install—— 此时会报错“nothing to install”,这是预期结果;说明已彻底清空
注意:composer remove * 不生效,composer update --with-dependencies 会误删基础命令依赖(比如 composer 自身靠 symfony/console),都不如手动清空 JSON 干净。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
重构后加新依赖,为什么 install 还卡在 Resolving dependencies?
这不是网络慢,是循环依赖实锤。尤其在重构中拆分模块后,容易出现 A 包 require B,B 包又通过 autoload 或 autoload-dev 反向加载 A 的 src —— Composer 看不到 require 行,但自动加载路径让它认定“你依赖你自己”。
验证方式:
- 运行
composer update --dry-run -v,看末尾是否反复出现同一路径回溯(如vendor/a → vendor/b → vendor/a) - 检查
composer.json中autoload和autoload-dev是否含../src、../../app这类越界路径 - 临时注释掉全部
require-dev条目,再试composer update;如果恢复成功,问题就出在测试工具反向加载上
破环只有三种方式:抽离契约包、运行时解耦、或把对方降级为 suggest —— 没有 “强制跳过” 选项。
CI 脚本里怎么避免依赖漂移?
关键不是删不删文件,而是锁住输入源。CI 中必须:
- 确保
composer.lock已提交到 Git,并在构建前校验其存在:test -f composer.lock || exit 1 - 禁用
--no-lock—— 它绕过 lock 文件,等于放弃版本一致性 - 不要用
composer install --no-scripts,某些框架(如 Laravel)的 autoloader 生成逻辑藏在 post-install-cmd 里,跳过会导致vendor/autoload.php缺失 - 如果要重置环境,用
composer clear-cache && rm -rf vendor composer.lock && composer install,而不是只删 vendor
最易被忽略的点:重构后改了 config.platform.php 或 minimum-stability,这些变更必须触发 composer update 并提交新 composer.lock,否则本地和 CI 解析出的包版本可能完全不同。










