起因
上上周五,我手贱升级了一下lodash,结果发现测试环境炸了。排查了半天才发现是版本冲突导致的。
当时就在想,能不能有个工具告诉我 这个包能不能升级 升级了会不会炸 项目里哪些包有安全漏洞 哪些包装了但根本没用
找了一圈,npm audit只告诉你有漏洞,但不告诉你怎么办。Dependabot会自动提PR,但经常升级完就出问题。
所以就自己写了这个Skill。
这个Skill做什么
简单说就是给你的项目依赖做个"体检",然后告诉你哪里有问题,怎么解决。
主要功能
1. 健康评分
给每个依赖打个分(0-100),一眼就能看出哪些有问题:
express: 100分 - 没问题
lodash: 65分 - 有个中危漏洞
moment: 35分 - 过时了而且你根本没用
评分规则:
- 有严重漏洞:-30分
- 版本过时:-20分
- 没被使用:-15分
- 升级不安全(主版本号变了):-10分
2. 升级建议
不是所有升级都安全。这个工具会告诉你:
# 这些可以放心升级(小版本更新)
npm install express@4.18.2
npm install lodash@4.17.21
# 这些要小心(大版本更新,可能有breaking changes)
npm install react@18.0.0 # 从17升到18,建议先看changelog
3. 依赖瘦身
检测哪些包装了但没用:
moment - 没用到,可以删
jquery - 没用到,可以删
underscore - 你已经有lodash了,功能重复
4. 跨项目对比
如果你维护多个项目,可以对比一下依赖版本:
项目A用的express是4.18,项目B用的是4.17
建议统一到4.18
支持的语言
- JavaScript/Node.js (package.json) - 完全支持
- Python (requirements.txt) - 完全支持
- Go (go.mod) - 完全支持
- Java (pom.xml) - 还没做
怎么用
基础用法
```python
from main import DependencyHealthManager
manager = DependencyHealthManager(“.”)
report = manager.generate_health_report()
print(report)
```
就这么简单。
生成的报告长这样
# 依赖健康报告
总体评分: 68/100 (一般)
统计:
- 总依赖数: 52
- 过时依赖: 15 (28.8%)
- 存在漏洞: 3
- 未使用依赖: 5
需要关注的依赖:
express (4.16.4 → 4.18.2)
- 健康分数: 45/100
- 问题: 版本过时, 存在2个安全漏洞
安全升级建议:
npm install express@4.18.2
npm install lodash@4.17.21
依赖瘦身建议:
npm uninstall moment jquery
```
项目结构
dependency-health-manager/
├── skill.json # 配置
├── main.py # 核心代码(650行左右)
├── README.md # 文档
├── examples/demo.py # 示例
└── tests/test_manager.py # 测试(26个用例)
测试
写了26个单元测试,全部通过:
```bash
$ python tests/test_manager.py
Ran 26 tests in 0.087s
OK
```
测试覆盖:
- 依赖文件解析
- 健康分数计算
- 报告生成
- 跨项目对比
- 异常处理
目前的限制
说实话,这个Skill还有些不完善的地方:
1. 漏洞数据是模拟的 - 没有真正接入CVE数据库API(需要申请key,有点麻烦)
2. 未使用检测不够准 - 只是简单判断,没有真正扫描代码
3. 只支持3种语言 - Java的pom.xml解析还没做
4. 没有可视化 - 都是文本报告,没有图表
但核心功能都能用,日常检查项目健康度完全够了。
为什么觉得这个有用
和现有工具的区别
npm audit:只告诉你有漏洞,不告诉你怎么办
Dependabot:自动升级,但经常升级完就出问题
这个Skill:给你完整的健康评估和具体建议
实际使用场景
- 每周一跑一次,检查项目健康度
- 升级依赖前先看看安全不安全
- 项目太臃肿了,看看能删哪些包
- 多个项目依赖版本不统一,对比一下
下载
GitHub仓库:https://github.com/Baijidot/dependency-health-manager-skill
## 后续计划
如果有时间的话:
接入真实的CVE数据库
做个Web界面
支持更多语言
加上依赖关系可视化
不过现在这个版本已经够用了。
有问题欢迎留言,或者直接提Issue。
如果觉得有用,点个赞吧。