执行 composer show vendor/package-name 可直接查看指定包的一级依赖,即其 composer.json 中 require 字段声明的内容,该命令不递归解析,也不显示依赖的依赖。

composer show 如何查看指定包的直接依赖
执行 composer show vendor/package-name 是最直接的方式,它会列出该包在 composer.json 中声明的 require 字段内容,即一级依赖。注意:这个命令不递归,也不会显示这些依赖自身所依赖的包。
常见误区是以为 composer show --tree 能直接展开全部依赖树——其实它只对已安装的包生效,且依赖解析基于当前 vendor/ 目录下的实际安装结果,而非纯声明关系。
- 若包未安装,
composer show vendor/package-name --tree会报错:Package vendor/package-name is not installed - 若想查未安装包的依赖结构,必须先用
composer require --dry-run或借助 Packagist API -
composer show -p可列出所有已知包(含未安装),但不带依赖信息
composer depends 查找谁依赖了某个包
composer depends 是反向依赖分析的关键命令,用于回答“哪些包把 monolog/monolog 当作依赖?”这类问题。它只检查当前项目已声明的依赖(composer.json)和已安装包(vendor/)的元数据。
执行 composer depends monolog/monolog 会输出直接依赖它的包;加 --tree 参数可尝试向上追溯,但受限于本地锁文件(composer.lock)是否完整记录了传递依赖的版本约束。
- 若某包通过
replace或provide声明兼容性,depends不会将其纳入结果 - 使用
--recursive并不能真正递归查找间接依赖者,它只是重复调用depends多次,容易漏掉条件分支路径 - 该命令无法反映未被安装但理论上满足约束的包(例如因平台配置被跳过的包)
如何手动模拟 Composer 的递归依赖解析逻辑
Composer 解析依赖不是简单 DFS 展开,而是基于 SAT 求解器进行版本约束满足判定。要逼近其行为,需分步模拟:
- 从目标包的
composer.json获取require列表(如php: ^8.0,psr/log: ^1.0) - 对每个依赖项,查询 Packagist API:
https://packagist.org/packages/{vendor}/{package}.json,拿到其所有可用版本及各版本的require - 根据
composer.json中的minimum-stability和prefer-stable筛选候选版本 - 合并冲突约束(例如 A 要
psr/log:^1.0,B 要psr/log:^2.0→ 无解)
下面是一个简化版 Python 脚本片段,用于获取某包最新稳定版的直接依赖:
import requests
def get_package_requires(vendor, package):
url = f"https://packagist.org/packages/{vendor}/{package}.json"
resp = requests.get(url)
data = resp.json()
latest = data["package"]["versions"][0] # 最新版本(通常为 stable)
return data["package"]["versions"][latest]["require"]
print(get_package_requires("monolog", "monolog"))
注意:Packagist 返回的 versions 字典 key 是版本号字符串(如 "2.9.1"),不是数组,需按语义化版本排序后取最新 stable 版。
为什么 lock 文件比 show/depends 更接近真实依赖树
composer.lock 是 Composer 实际解析并锁定的结果,包含每层依赖的精确版本、源类型(dist/git)、以及 require 和 require-dev 的完整展开(不含 dev 依赖除非在 root 中启用)。它才是递归解析过程的最终快照。
解析 composer.lock 时要注意:
-
packages数组只包含运行时依赖(即非require-dev),而packages-dev是独立字段 - 一个包可能在多个位置被引入(如
laravel/framework和symfony/console都依赖psr/container),但lock中只存一份,版本由全局约束决定 - 若存在
platform配置(如"php": "8.1.0"),会影响某些包是否被纳入解析结果,但不会体现在show输出中
复杂点在于:依赖路径不唯一,同一包可能经由多条路径到达,而 Composer 总是选择满足所有约束的最小公共版本——这点仅靠人工展开 show 或爬 API 很难还原。










