Composer项目修改composer.json后,如何清理未使用依赖包?
安全清理未使用Composer依赖的可行方案
针对你遇到的场景——自研工具修改composer.json丢失require操作历史、依赖wikimedia/composer-merge-plugin合并配置、无法接受全量更新或重装带来的低效/版本重置问题,这里有几个更贴合需求的解决方案:
方案1:使用专门的依赖分析工具(推荐)
直接用composer-unused/composer-unused这个Composer插件,它专门用来检测项目中未被实际引用的依赖包,完美适配依赖合并的场景:
- 临时全局安装(避免污染项目依赖):
composer global require composer-unused/composer-unused - 运行依赖分析:
这个命令会自动完成:composer unused --no-update- 识别
wikimedia/composer-merge-plugin合并后的完整依赖列表 - 扫描项目代码,检测哪些包的类/函数从未被调用
- 输出清晰的未使用包列表,全程不会触发任何版本更新
- 识别
- 优势:无需手动处理杂乱的文本输出,准确率高,完全规避
composer update或重装的弊端
方案2:手动处理composer show输出,精准定位未使用包
如果不想引入第三方工具,可以通过文本处理解决composer show的输出干扰问题:
- 提取所有已安装的包名(过滤警告信息):
用composer show --installed | grep -E "^[a-z0-9\/]+" | awk '{print $1}' > installed-packages.txtgrep过滤掉非包名的行,awk提取第一列的包名,彻底避开警告内容 - 批量检查每个包的依赖关系:
对每个包执行composer why <package-name>,如果输出为No dependencies found,说明这个包没有被其他依赖或项目直接引用,可以标记为待移除:while read pkg; do if composer why "$pkg" | grep -q "No dependencies found"; then echo "$pkg is unused" >> unused-packages.txt fi done < installed-packages.txt - 安全移除冗余包(避免意外更新):
composer remove --no-update $(cat unused-packages.txt)
- 注意:这个方法需要人工二次确认,因为
composer why无法检测到通过动态调用(比如class_exists())引用的包
方案3:生成合并后的完整配置做对比
虽然wikimedia/composer-merge-plugin会合并多个配置,但你可以让Composer输出最终生效的完整依赖,和修改后的composer.json对比:
- 生成合并后的完整require配置(需提前安装
jq工具解析JSON):composer config --list --json | jq '.config.require' > merged-require.json - 提取当前
composer.json的require部分:jq '.require' composer.json > current-require.json - 对比两个文件,找出只存在于合并后配置但不在当前
composer.json中的冗余依赖:jq -n 'inputs | reduce .[] as $item ({}; .[$item] = 1)' merged-require.json current-require.json | jq 'keys | map(select(. as $k | current-require.json | has($k) | not))'
- 优势:能快速定位合并后多余的依赖,适合配合
composer why做二次验证
无论用哪种方案,执行composer remove后一定要先运行composer dump-autoload测试自动加载是否正常,再提交代码。
内容的提问来源于stack exchange,提问作者Dinu
相关产品推荐
相关产品推荐

