composer.lock只记录SAT求解器最终选定的依赖包,未出现说明被conflict排除、平台约束不满足、被replace替代或仅存在于require-dev但未安装。

因为那些包根本没被选中——composer.lock 只记录最终求解器确认安装的版本,不是“所有可能被扫描过的包”。
composer.lock 里缺失某个包,说明它没进入最终解
Composer 不会把所有依赖候选都写进 composer.lock,只存 SAT 求解器输出的可行解中实际用到的包。常见情况包括:
- 该包被某个
conflict规则显式排除(比如"conflict": {"old/package": "*"}) - 它的所有可用版本都不满足 PHP 版本、稳定性或平台约束(如
"php": ">=8.2",而该包最高只支持 8.1) - 它被另一个
replace包替代了(例如psr/log被monolog/monolog的"provide": {"psr/log": "^1.0"}覆盖) - 它只是某个包
require-dev中的依赖,而你运行的是composer install(默认不装require-dev)
为什么 composer show 能看到它,但 lock 里没有?
composer show 查的是本地已下载的包元数据或仓库缓存,不是当前项目的真实依赖图。它可能显示:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 你之前手动
require过又删掉了,但 vendor 里残留着文件 - 它是某个子依赖的子依赖,但因约束冲突被整条路径剪枝,压根没参与最终求解
- 你用过
composer require --dev,但它没出现在composer.lock.packages-dev里——检查是否漏了--with-dependencies或被config.platform屏蔽
如何确认一个包是否“该出现却没出现”?
别只盯 composer.lock 文件,用命令验证真实状态:
-
composer depends package/name:如果返回空,说明没有任何已解析包依赖它 -
composer prohibits package/name:看是否被conflict或平台限制直接否决 -
composer update --dry-run -v:加-v会打印求解器筛选过程,你能看到它在哪一步被丢弃(比如 “discarding package/name 1.2.0: does not match your PHP version”)
最常被忽略的一点:lock 文件不是“日志”,也不是“缓存”。它是一次性快照,只反映上一次成功求解的结果。如果你改了 composer.json 却没 update,或者删了 lock 后直接 install,那它就按旧解装——哪怕那个包现在明明该被拉进来,也不会自动补上。

















