composer show 不能统计代码行数,因其仅读取 installed.json 中的元数据(如名称、版本、描述),不解析文件内容或路径,更无行数字段;真实统计须用 cloc 等工具遍历 vendor/ 目录。

composer show 不能统计代码行数,它只读 vendor/composer/installed.json,里面根本没有路径和行数字段。真要算,必须落到文件系统上,用专门的代码统计工具遍历 vendor/ 目录。
为什么不能用 composer show 或其他 Composer 命令直接统计?
因为 Composer 的职责是依赖解析与安装,不是代码分析。composer show 输出的是元数据(名称、版本、描述),composer show --tree 展示的是包间关系,它们都不触碰实际 PHP/JS 文件内容。连文件路径都只在 installed.json 里模糊存为 dist 或 source 类型,不保证可访问、不包含行计数逻辑。
常见误操作包括:
- 运行
composer show | wc -l—— 统的是命令输出行数,不是源码行数 - 以为
composer dump-autoload -o会生成行数报告 —— 它只优化类加载,不扫描内容 - 依赖
composer outdated结果估算“体量” —— 过时 ≠ 行多,小包也可能有大量模板或配置
用 cloc 统计 vendor/ 下所有包的真实代码量(推荐)
cloc 是目前最稳定、语言识别准、排除规则灵活的 CLI 工具。它能自动跳过注释、空行、测试目录,并支持按包拆分结果。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
在项目根目录执行:
cloc --exclude-dir=tests,Examples,docs,benchmarks,node_modules,.github,vendor/composer vendor/ --by-file --quiet
关键点说明:
-
--exclude-dir必须显式列出干扰项:很多包自带tests/、Examples/,不剔除会导致结果虚高 2–5 倍 -
vendor/composer要单独排除——它是 Composer 自身的元数据目录,不是任何包的源码 -
--by-file让输出带具体文件路径,方便你反查是哪个包贡献了最多行数(比如发现symfony/console占了 12k 行,而你只用了 2 个命令) - 它不区分顶层依赖和子依赖;如需只算
composer.json里require的包,得先用composer show --tree | head -n 20提取一级包名,再循环调用cloc vendor/{package}
统计后怎么判断“代码量是否合理”?
行数本身没意义,得结合使用方式看。几个实用判断角度:
- 某个包行数远超同类(比如
monolog/monolog6k 行 vspsr/log200 行)——确认你是否真需要它的全部功能,还是只用接口 -
vendor/总行数 > 项目自身代码 3 倍以上?重点检查是否引入了带完整 UI 的 SDK(如某些支付、地图包附带大量前端资源) - 单个包里
src/占比低于 30%,其余是docs/、resources/、stubs/—— 这些通常不参与运行,但占磁盘、拖慢git clone和 CI 缓存 - 发现大量
*.blade.php、*.vue在vendor/里?说明你可能误装了 Laravel 或 Vue 生态的“应用级”包,而非纯库
真正难的不是跑出数字,而是理解这些行在运行时是否被加载、是否被你的代码路径触发。比如 symfony/polyfill-* 包可能有 5k 行,但它只在函数缺失时才被 autoloader 加载——这种“按需膨胀”不能简单用行数否定。

















