
composer depends 查不到包是因为它只检查当前项目已安装的依赖(vendor/ 和 composer.lock),未安装、仅在 require-dev 中、或包名拼错都会导致查不到;需先确保包已通过 composer install 安装。
默认情况下 composer depends 只显示直接依赖你这个包的项目(即 require 了它的 composer.json),不会递归查找间接依赖。如果你本地没安装该包,或它只是被某个已安装包的 require-dev 引入,composer depends 就会返回空。
实操建议:
composer install 或 composer require 安装到当前项目中--tree 参数可展开依赖树,但仅限已解析的已安装包composer depends --recursive 并不存在 —— Composer 原生命令不支持跨项目扫描不是必须,但不用就容易漏关键信息。composer depends 默认只输出包名,不区分是 require 还是 require-dev,也不告诉你版本约束。
实操建议:
--link-type=require 或 --link-type=require-dev 明确筛选依赖类型--format=json 输出结构化数据,方便脚本解析;--format=plain(默认)适合人工快速扫一眼"monolog/monolog": "^2.0" 和 "^3.0",这些信息只有加 --tree 或看完整 composer show -t 才能确认原生命令能力有限,尤其要查“哪些项目用了旧版 laravel/framework”,或者“公司所有代码库中谁还在 require guzzlehttp/guzzle:6.*”——这时候得组合外部工具。
实操建议:
grep -r "guzzlehttp/guzzle.*6\." /path/to/projects/ --include="composer.json" 快速定位文本匹配composer show guzzlehttp/guzzle --no-ansi 2>/dev/null | head -n1 拿实际安装版本composer depends 查的是“当前 lock 文件记录的依赖关系”,不是 composer.json 里写的约束;lock 文件过期会导致结果不准这不是网络问题,而是 Composer 在当前项目的 vendor/ 和 composer.lock 中根本没找到这个包的安装记录。哪怕 composer.json 里写了 "require",只要没运行过 composer install,就不会被识别。
实操建议:
composer show 确认包是否真在 vendor 里symfony/console 不等于 console)require-dev 的,确保没加 --no-dev 
replace 或 provide 机制覆盖后,composer depends 也可能找不到原始包名composer.lock、安装参数、甚至平台配置实时变化。最常被忽略的一点:你在 CI 或 Docker 构建中运行 composer depends,但构建镜像时用了 --no-dev,那 require-dev 里的依赖就彻底不可见了。