☰
阅读Skylos源码指南:analyzer、visitors、rules三大核心模块深度剖析
2026/10/26 10:09:51 网站建设 项目流程

【免费下载链接】skylos

Open source local-first PR scanner that finds dead code, security bugs, secrets, quality regressions, and AI-code mistakes before merge. For first timers refer to https://duriantaco.github.io/skylos/repo-map/

项目地址:https://gitcode.com/gh_mirrors/sk/skylos
点击查看免费下载

Skylos 是一款开源的本地优先 PR 代码扫描器,能在合并前发现死代码、安全漏洞、泄露密钥、质量回归和 AI 代码错误。这篇源码阅读指南带你从零看懂 Skylos 代码扫描器的三大核心模块:analyzer(分析引擎)、visitors(AST 访问器)与 rules(规则引擎),即使是 Python 新手也能快速上手源码阅读。

🚀 第一步:获取 Skylos 源码仓库

打开终端,执行以下命令克隆仓库并浏览源码:

git clone https://gitcode.com/gh_mirrors/sk/skylos.git cd skylos

建议配合官方仓库地图学习:[docs/repo-map/](https://link.gitcode.com/i/1d5e3a78d4ba50a45b9678091ba03407)下有可视化仓库地图,帮助你在开始阅读前先建立全局印象。

🏗️ 整体架构一眼看懂

Skylos 的扫描流程可以概括为一条清晰的数据流水线:

模块路径角色比喻职责
analyzerskylos/analyzer.py大脑调度扫描、发现文件、汇总结果
visitorsskylos/visitors/眼睛遍历语法树,收集定义与引用
rulesskylos/rules/法官执行检查规则,产出具体发现

三者分工明确:analyzer负责"扫描什么文件",visitors负责"看懂代码结构",rules负责"判定哪里有问题"。

🧠 analyzer 模块:扫描调度的大脑

analyzer 的核心是一个 6600 多行的主文件 skylos/analyzer.py,重点看三处入口:

  1. Skylos主类(skylos/analyzer.py) 整个扫描器的状态容器,负责文件发现、模块名解析(_module方法把文件路径转成pkg.mod形式的模块名)、死代码判定等。

  2. Skylos.analyze()方法(skylos/analyzer.py) 一次完整扫描的总入口,按语言分派任务:Python 走 AST 分析,Go、TypeScript、PHP 等语言各有对应的处理分支。

  3. analyze()/proc_file()顶层函数(skylos/analyzer.py、skylos/analyzer.py) CLI 与外部 API 调用的门面。proc_file()把任务交给 skylos/analysis/file_worker.py 中的process_file()(skylos/analysis/file_worker.py),由它决定走 Python 解析器还是非 Python 扫描分支。

新手阅读建议:从analyze()的函数签名看起,每个enable_*参数对应一类检测能力(enable_secrets、enable_danger、enable_quality、enable_ai_defects),这就是你后面会遇到的规则分类。

👀 visitors 模块:遍历语法树的"眼睛"

visitors 模块基于 Python 标准库的ast.NodeVisitor实现,核心文件:

  • 基类Visitor:skylos/visitors/base.py,实现了visit_Import、visit_FunctionDef、visit_If等几十个 AST 节点处理器,把代码中的函数、类、变量收集为定义(Definition)(skylos/visitors/base.py),并把每次使用记录为引用(ref)。死代码检测的本质就是:定义没有被任何引用。
  • Definition数据类(skylos/visitors/base.py):保存一个符号的名字、位置、文件、模块名,是死代码与 API 幻觉检测的基础数据结构。
  • 场景增强访问器:skylos/visitors/test_aware.py(测试代码感知)、skylos/visitors/framework_aware.py(Django、Flask 等框架约定感知),避免把框架回调误判为死代码。
  • 多语言支持:skylos/visitors/languages/ 下按语言分目录,覆盖 TypeScript、Go、Java、PHP(含 Drupal)、Rust、C++、Kotlin、Shell 等。

下面这张 VS Code 中的安全扫描结果截图,正是 visitors 遍历语法树后、规则引擎判定问题的最终呈现:

⚖️ rules 模块:产出发现结果的规则引擎

所有规则共享一个极简的抽象基类(skylos/rules/base.py),只有三个要素:rule_id(规则编号,如 SKY-D203)、name(规则名称)、visit_node()(在 AST 节点上执行检查)。规则由 skylos/core/linter.py 中的LinterVisitor驱动——它按 AST 节点类型把规则分桶,逐节点调用,是"眼睛"与"法官"之间的传令官。

规则按职责分目录组织:

规则目录代表文件检测什么
skylos/rules/quality/complexity.py、clones.py圈复杂度、认知复杂度、代码克隆、God Class
skylos/rules/danger/calls.py、taint.py危险调用、SQL 注入、命令注入等安全漏洞
skylos/rules/secrets.py—硬编码密钥、凭证泄露
skylos/rules/ai_defect/phantom_refs.pyAI 生成代码的"幻觉":不存在的 API、幽灵依赖
skylos/rules/sca/vulnerability_scanner.py依赖漏洞(SARIF、OSV 元数据)

所有规则的登记表在 skylos/rules/catalog.py,get_rule_catalog()函数返回完整规则清单——建议把它当作 rules 模块的目录页来读。

下图展示了扫描结果在 VS Code 安全面板中的最终形态:Security 与 Quality 两类发现被分类列出:

🔗 三大模块如何协同工作

一次完整扫描的协作链路:

  1. analyzer的analyze()发现项目中的全部源文件(skylos/core/file_discovery.py);
  2. 对每个文件调用process_file(),visitors构建语法树,收集 defs/refs 并计算死代码;
  3. rules中的LinterVisitor遍历同一棵树,每个规则通过visit_node()输出发现(finding);
  4. analyzer汇总所有发现,按置信度(HIGH / MEDIUM / LLM only)分级,交给报告层输出到终端、SARIF 或 CI 注释。

🗺️ 新手源码阅读路线

  • 第 1 天:读 skylos/rules/base.py(不足 30 行)+ skylos/rules/quality/class_size.py,理解一条规则的完整写法;
  • 第 2 天:读 skylos/visitors/base.py 的visit_FunctionDef与visit_Import,理解定义与引用如何被收集;
  • 第 3 天:从 skylos/analyzer.py 的analyze()顶层函数顺藤摸瓜,跑通一次完整扫描流程;
  • 配套资料:docs/ 下有 docs/ai-code-verification.md、docs/agent-verification.md 等专题文档,测试用例(test/ 目录 400+ 个)是理解每条规则预期行为的最佳教材。

总结

Skylos 源码的三大模块各司其职:analyzer是调度大脑,visitors是收集证据的眼睛,rules是产出结论的法官。理解了"发现文件 → 构建语法树 → 收集定义引用 → 规则判定 → 汇总报告"这条主线,再深入任何子模块(多语言、AI 缺陷检测、SARIF 报告)都会事半功倍。

【免费下载链接】skylos

Open source local-first PR scanner that finds dead code, security bugs, secrets, quality regressions, and AI-code mistakes before merge. For first timers refer to https://duriantaco.github.io/skylos/repo-map/

项目地址:https://gitcode.com/gh_mirrors/sk/skylos
点击查看免费下载
上一篇:一家AI公司是怎么造出来的?Auto-Company 五层多智能体系统架构深度拆解
下一篇:Streamyfin:基于 Expo 的现代 Jellyfin 视频客户端——核心功能、实验特性与开发环境搭建全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询