name: dead-code-removal description: 安全地检测并移除多种编程语言中未使用的代码(导入、函数、类)。适用于重构后、移除功能时或生产部署前。包含安全检查与验证。 author: Joseph OBrien status: unpublished updated: ‘2025-12-23’ version: 1.0.1 tag: skill type: skill
死代码移除
此技能可安全地识别并移除多种编程语言中未使用的代码。它包含全面的安全检查,以防止移除实际需要的代码。
何时使用此技能
- 重构代码并移除功能后
- 生产部署前以减少包大小
- 清理遗留代码时
- 移除已弃用的功能时
- 优化代码库大小时
- 维护代码质量标准时
此技能的功能
- 语言检测:识别项目语言和结构
- 入口点映射:映射入口点和关键路径
- 依赖分析:构建依赖图和使用模式
- 安全检测:通过安全检查识别未使用的元素
- 增量移除:通过验证逐步移除代码
- 备份创建:在更改前创建备份
辅助脚本
此技能在 scripts/ 目录中包含 Python 辅助脚本:
-
find_unused_imports.py:使用 AST 解析准确检测 Python 文件中未使用的导入。输出包含未使用导入和行号的 JSON。python scripts/find_unused_imports.py src/utils.py src/services.py
如何使用
移除未使用代码
在此项目中查找并移除未使用的导入和函数
清理 src/ 目录中的死代码,但要保守操作
特定分析
检查 src/utils/ 中未使用的函数并安全地移除它们
分析流程
1. 语言检测
识别项目类型:
- Python:查找
pyproject.toml、setup.py、requirements.txt - JavaScript/TypeScript:检查
package.json、tsconfig.json - Java:查找
pom.xml、build.gradle - Go:检查
go.mod - Rust:检查
Cargo.toml
检测入口点:
- Python:
main.py、__main__.py、app.py、run.py - JavaScript:
index.js、main.js、server.js、app.js - Java:
Main.java、*Application.java、*Controller.java - 配置文件:
*.config.*、settings.*、setup.* - 测试文件:
test_*.py、*.test.js、*.spec.js
2. 构建依赖图
跨文件依赖:
- 跟踪导入和 require 语句
- 映射函数/方法调用
- 识别类继承
- 跟踪动态使用模式
框架模式:
- 保留特定框架模式(Django 模型、React 组件等)
- 检查装饰器和注解
- 验证入口点注册
3. 检测未使用元素
使用辅助脚本:
此技能包含一个用于查找未使用导入的 Python 辅助脚本:
# 在 Python 文件中查找未使用的导入
python scripts/find_unused_imports.py src/utils.py src/services.py
未使用的导入:
# Python:基于 AST 的分析
import ast
# 跟踪:导入语句与实际使用情况
# 跳过:动态导入(importlib、__import__)
// JavaScript:模块分析
// 跟踪:import/require 与引用
// 跳过:动态导入、懒加载
未使用的函数/类:
- 定义:所有声明的函数/类
- 引用:直接调用、继承、回调
- 保留:入口点、框架钩子、事件处理器
4. 安全检查
绝不移除如果:
- Python:检测到
getattr()、eval()、globals()使用 - JavaScript:
window[]、this[]、动态import()使用 - Java:反射、注解(
@Component、@Service) - 框架模式:模型、控制器、路由、组件
- 入口点:主函数、应用初始化
- 测试文件:所有与测试相关的代码
框架保留:
Python:
- Django:模型、迁移、管理员注册
- Flask:路由、蓝图、应用工厂
- FastAPI:端点、依赖项
JavaScript:
- React:组件、钩子、上下文提供者
- Vue:组件、指令、混入
- Angular:装饰器、服务、模块
Java:
- Spring:Bean、控制器、仓库
- JPA:实体、仓库
5. 安全移除流程
备份创建:
backup_dir="./unused_code_backup_$(date +%Y%m%d_%H%M%S)"
cp -r . "$backup_dir" 2>/dev/null || mkdir -p "$backup_dir" && rsync -a . "$backup_dir"
增量移除:
- 创建包含更改的临时文件
- 验证语法
- 运行可用测试
- 应用或回滚
验证:
# Python
python -m py_compile file.py
python -m pytest
# JavaScript
npx eslint file.js
npm test
# Java
javac -Xlint file.java
mvn test
示例
示例 1:移除未使用导入
输入:清理 src/utils/helpers.py 中未使用的导入
输出:
## 死代码移除:src/utils/helpers.py
### 分析
- **文件**:`src/utils/helpers.py`
- **总导入数**:8
- **未使用导入**:3
### 发现的未使用导入
1. `import os` - 第 2 行(未在任何地方使用)
2. `import json` - 第 3 行(未在任何地方使用)
3. `from datetime import timedelta` - 第 5 行(未在任何地方使用)
### 可安全移除
✅ 所有 3 个导入均可安全移除(未检测到动态使用)
### 更改
```python
# 之前
import os
import json
from datetime import datetime, timedelta
import requests
# 之后
from datetime import datetime
import requests
验证
- ✅ 语法检查通过
- ✅ 测试通过
- ✅ 未检测到动态导入
### 示例 2:移除未使用函数
**输入**:查找 `src/services/` 中未使用的函数
**输出**:
```markdown
## 死代码移除:src/services/
### 分析
- **分析的文件**:12
- **发现的函数**:45
- **未使用函数**:2
### 未使用函数
**1. `formatOldDate()` 在 `src/services/utils.js` 中**
- **位置**:第 34-42 行
- **状态**:✅ 可安全移除
- **原因**:未找到引用,未导出,未在测试中使用
**2. `legacyAuth()` 在 `src/services/auth.js` 中**
- **位置**:第 78-95 行
- **状态**:⚠️ 已保留(框架模式)
- **原因**:在路由配置中引用(第 12 行)
### 总结
- **已移除**:1 个函数(`formatOldDate`)
- **已保留**:1 个函数(框架使用)
- **移除的行数**:9
- **大小减少**:约 300 字节
最佳实践
安全指南
应做:
- 每次移除后运行测试
- 保留框架模式
- 检查模板中的字符串引用
- 持续验证语法
- 创建全面备份
- 增量移除
不应做:
- 在不理解目的的情况下移除
- 未经测试批量移除
- 忽略动态使用模式
- 跳过配置文件
- 从迁移中移除
- 移除导出/公共 API
检测模式
静态分析:
- 使用 AST 解析进行准确检测
- 跟踪跨文件引用
- 检查动态使用模式
- 验证特定框架模式
验证:
- 始终运行语法检查
- 移除后运行测试
- 验证构建是否仍能工作
- 检查运行时错误
报告
报告应包含:
- 分析的文件(数量和类型)
- 检测到的未使用项(导入、函数、类)
- 安全移除项(含验证状态)
- 保留项(保留原因)
- 影响指标(移除的行数、大小减少)
相关用例
- 发布前代码清理
- 减少包大小
- 移除已弃用代码
- 维护代码质量
- 重构遗留代码库
- 优化构建时间