composer show -t . 必须加点号是因为.代表当前项目虚拟根节点,才能从composer.json的require开始递归展开完整依赖树;不加则仅输出顶层包名,且需vendor/存在、composer.lock有效。

composer show -t . 为什么必须加点号才能看到主包
不加 .,composer show -t 只输出顶层包名(比如 your-project-name dev-main),根本不会展开任何依赖树——它默认把“当前项目”当黑盒,不解析其 composer.json 中的 require。加 . 才把当前项目当作虚拟根节点,从你写的 require 开始向下递归展开整条链路。如果输出只有一行且没缩进,说明 vendor/ 为空或 composer.lock 缺失,show -t 就没东西可展。
深层嵌套里主包“消失”了,其实是没被真正安装
在 composer show -t . 输出中看到某个包(比如 symfony/console)出现在多层缩进里,但 vendor/symfony/console 目录实际不存在,这说明它只是被某条 require 声明“请求过”,但最终没进安装列表。原因通常是:上游包用 replace 或 provide 虚拟声明了该包,Composer 认为已满足,跳过真实安装;或者 SAT 求解器因冲突主动剔除了它。此时不能靠 composer require 强装,得先用 composer prohibits symfony/console:6.4.0 查谁在拦路。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
自动化诊断要绕开 composer depends 和 composer why 的坑
composer depends 和 composer why 对 provide/replace 场景支持极差,容易漏掉关键路径。真正能自动定位“主包为何没装”的命令是:
-
composer show --who symfony/console:扫描所有已安装包的require字段,返回直接声明它的包(加--no-dev可过滤干扰项) -
composer why --tree symfony/console:必须带--tree,否则只显示一级上游;末尾出现your-project-name dev-main才算确认是你自己写的require拉进来的 -
composer update --dry-run -v:不改文件,但会打印 SAT 求解器每一步推演,看到哪一步主动丢弃了主包,比看树更准
为什么可视化图反而可能误导你判断主包缺失
用 composer-dependency-graph 生成的 PNG 或 HTML 图,只反映 composer.lock 里记录的已安装包关系,不会画出“被请求但未安装”的包。如果你的主包因冲突被求解器丢弃,图里就彻底消失,看起来像它根本没被依赖——但这不是事实,只是图没能力表达“求解失败路径”。此时必须退回 composer show -t . + composer prohibits 组合,前者看声明链,后者看拦截点。










