硬编码检测工具
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_35039dbf/hardcode-finder
技能介绍
你要面对的问题
硬编码不是一开始就写出来的。它从一句 baseUrl = "https://api.example.com" 开始,从一次偷懒的 padding: 16px 开始,然后像霉菌一样扩散。项目里有中文文案直接写在 Toast.makeText(context, "网络请求失败", ...) 里,有超时时间藏在 readTimeout = 30000,有 API 端点散落在各个 Activity。等到要支持多语言、切换测试环境、做暗黑模式时,才发现改一个字符串要翻十几个文件,漏掉一处就出问题。
问题不在于"有没有写注释",而在于散落的字面量无法被单一来源管理。硬编码检测工具要解决的,就是把这些分散的、不可见的字面量暴露出来,告诉你它们藏在哪里、严重程度如何、该怎么改。
工具如何工作
工具的核心是一个扫描器:遍历项目文件,按语言和类型匹配字面量,过滤噪音,输出结果。整个流程不依赖任何第三方包,只需要 Python 3.9+ 环境即可运行。
检测分五类,对应不同的风险等级:
string:字符串常量,中文字符串判定为 HIGH,英文为 MEDIUMnumber:魔法数字,LOW / MEDIUMurl:URL 和 API 端点,统一 HIGHconfig:配置值(超时、分页阈值等),MEDIUMlayout:UI 布局硬编码,覆盖 margin、padding、border-radius、width、height、font-size、gap、box-shadow 及定位属性
过滤机制比检测本身更关键。 工具会自动跳过注释、import 语句和以大写字母命名的常量定义——private static final String API_KEY 这类不算硬编码,因为它们已经是被命名的常量,可以被统一替换。
布局检测支持多框架语法,不只是找 margin: 16px 这样的 CSS,还能识别 SwiftUI 的 .padding(16)、Flutter 的 EdgeInsets.all(16)、React Native 的 marginTop: 16,以及 Android XML 的 android:layout_margin="16dp"。这对跨端团队尤其重要,同一套设计规范在不同框架里的写法完全不同。
输出层面, 支持文本、JSON、CSV 三种格式,可以用 --type 限定检测类型、--ext 限定文件扩展名、--ignore 排除目录。CI/CD 场景下,发现 HIGH 级别问题会返回码 1,可以直接卡住流水线。
使用边界
工具不负责修复,只负责暴露。它告诉你 30000 这个数字在哪里、属于 MEDIUM 级别,但要不要抽到配置文件、抽到哪一层,仍然是工程决策。
另外,规则匹配天然有误报:--ignore-logs 可以跳过日志语句中的硬编码,但更复杂的业务场景——比如字符串拼接、国际化资源已经部分迁移的情况——需要人工确认。建议把它当成代码审查的前置筛子,而不是替代 review 的银弹。
使用场景
- 代码审查前扫描改动文件,定位中文字符串和 URL 硬编码并按严重级别排序
- CI/CD 流水线中自动检测 HIGH 级别问题,发现问题时用返回码 1 阻断合并
- 重构前评估全项目硬编码现状,导出 CSV 清单确定要迁移到配置层的范围
- 设计规范落地时扫描各端布局代码,找出各框架中未抽到主题的尺寸和间距值
适合人员
- 移动端开发,需要在 Java/Kotlin/Swift 项目中清理散落的字符串和布局硬编码
- 后端工程师,想统一 Python/Go/Rust 服务里的超时、分页等配置值
- 全栈或跨端工程师,维护同一套设计规范在 CSS、SwiftUI、Flutter 等多种语法中的落地
- 平台工程负责人,要在 CI/CD 流水线里加一道硬编码门禁防止回归