用 Swift 编写的工程代码静态分析命令行工具 smck

最近几周在用 swift 做一个命令行工具 smck 用来对现有 OC 工程的代码做些分析和处理。日后工程切换成 Swift 可以加上对 Swift 工程代码的支持。昨天看到喵神在微博上说他下周要直播 live coding 一个 swift 的命令行工具,传送门: 现场编程 - 用 Swift 创建命令行工具 fengniao-cli Part1 ,其实蛮期待。想想跟喵神挺有缘的,最近下了他开发的 iOS 应用 Mail Me,随时能够记录工作和准备讲座时一些灵感,smck 的一些实现还有模块的设计灵感也是通过这个应用随时记录了下来呢,所以也推荐大家使用,真心方便。还有先前 Segmentfault 邀请我这个月31号在他们的直播平台上做个讲座,传送门: 深入剖析 iOS 编译 Clang / LLVM - 戴铭 - SegmentFault 讲堂 ,先前写过一篇文章,直播可能更利于演示和详细说明一些细节吧。看来这段时间我要跟喵神做好多类似的事情了。smck 的代码今天已经放到了 Github 上,地址:https://github.com/ming1016/smck

smck 可以做哪些事情呢?

  • 简单的比如命名规则的检查,按照团队标准来,如所有继承 UIViewController 的命名末尾统一成 VC,继承 JSONModel 的命名末尾统一成 Model,还有特定功能基类的子类按照一定的命名规则来。
  • 再比如查找所有中文字符串列出每个字符串分别使用在哪个控件上。
  • 根据类是否被初始化或直接调用等规则检查来分析哪些类从来没有调用过来判断是否是没有用的类。
  • 对工程质量的检查,比如 NSString,block,NSArray 的属性检查否是为 copy,还有 protocol 是否为 weak,Array 的操作是否使用具有安全操作的 Category 来做等等。 当然需要检查分析和处理的肯定不止这些,所以在 smck 这个程序设计成了一种非常利于添加各种检查功能模块的结构,通过简单的代码编写每个人或团队都可以方便编写添加各种 checker。

是怎么做到简单编写就能够添加功能呢?

因为代码分析的过程会通过一系列已经编写好的 parser 来完成,parser 会完成 token 的分析和上下文还有工程全局分析输出所有节点的数据信息,根据这些完整的信息和已经定义好的一系列具有完整包含关系的结构体就能够进行各种各样功能的定制化了。下面是一些 parser 和功能介绍:

  • ParsingMethod.swift :会返回 Method 结构体,包含了方法名,各个参数,方法内使用过的方法,方法内定义的临时变量等信息。
  • ParsingMethodContent.swift :会分析方法内的 token 根据语法形成数组结构进行处理。这里需要处理的东西很多,目前还在根据计划添加更多的数据输出。
  • ParsingMacro.swift :处理宏定义,主要是输出 token 给其它 parser 来处理。
  • ParsingImport.swift :返回 Import 结构体,包含引入的类名,包名
  • ParsingProperty.swift :会分析定义的属性 Property 信息
  • ParsingInterface.swift :会根据这个分析出一个文件中定义了多少各类,类的结构体 Object 里类名,父类名,类别名会在这里解析出。
  • ParsingProtocol.swift :会将分析出的协议设置到 Object 结构体中。
  • ParsingObject.swift : 目前主要是分析出使用过的类的信息。

生成的 File 结构体里面套装各个子结构体,断点如图:

如何调试 smck?

先填上对应的命令行参数和值,设置参数参考下图。然后运行即可。

导出成命令行工具

在 Xcode 里选择 Product - Archive - Export 即可,如图: 执行

./smck -o /User/your_project_path

输出如下

如何编写自己的检查功能?

由于工程检查规则非常多样化,所以需要编写一些 Plugin,后面我会逐渐抽出一些具有共性的放上来,目前在 Plugin 目录下我放了两个例子,在例子里可以看出来怎么通过订阅 Parser 输出的不同节点的不同数据来进行不同的检查。在控制台管理相关的 Checker 类里关联 Parser 和 Plugin 的代码由于使用了 RxSwift 也变得非常简洁明了,如下:

func doO(path:String) {
    guard path.characters.count > 0 else {
        return
    }
    UnUseObjectPlugin().plug(ob: ParsingEntire.parsing(path: path))
}
时间: 2024-10-06 16:06:03

用 Swift 编写的工程代码静态分析命令行工具 smck的相关文章

nodejs 编写(添加时间戳)命令行工具 timestamp

Nodejs除了编写服务器端程序还可以编写命令行工具,如gulp.js就是Nodejs编写的. 接下来我们来实现一个添加时间戳的命令: $ timestamp action https://www.npmjs.com/package/timestamp007 1.需要用的模块: commander  模块 用途 :解析命令行参数 主页: https://tj.github.io/commander.js/ fs 模块 用途 :于对系统文件及目录进行读写操作 2.命令格式 编写命令行工具前,首先定

Swift 命令行工具

Swift 的 REPL (Read-Eval-Print Loop) 环境可以让我们使用 Swift 进行简单的交互式编程.也就是说每输入一句语句就立即执行和输出.这在很多解释型的语言中是很常见的,非常适合用来对语言的特性进行学习. 要启动 REPL 环境,就要使用 Swift 的命令行工具,它是以 xcrun 命令的参数形式存在的.首先我们需要确认使用的 Xcode 版本是否是 6.1 或者以上,如果不是的话,可以在 Xcode 设置里 Locations 中的 Command Line T

swift 命令行工具初探

亲爱的同学们好,今天我们要介绍这么一个东西.相信有过解释型语言(PHP,Ruby,等)使用经验的同学会更加熟悉,就是 Swift 也为我们提供了命令行运行工具,俗称 REPL.好了,我们进入正题,在安装好 Swift 开发环境的机器上,打开命令行,输入 swift 命令,就进入了 swift 命令行运行模式: Welcome to Swift version 1.1 (swift-600.0.20.0). Type :help for assistance. 1> 现在,Swift 命令工具已经

Node.js 命令行工具的编写

日常开发中,编写 Node.js 命令行工具来完成一些小任务是很常见的操作.其编写也不难,和日常编写 Node.js 代码并无二致. package.json 中的 bin 字段 一个 npm 模块,如果在 package.json 中指定了 bin 字段,那说明该模块提供了可在命令行执行的命令,这些命令就是在 bin 字段中指定的. package.json { "bin": { "myapp": "./cli.js" } } 程序安装后会可在

Scrapy 1.4 文档 05 命令行工具

在系统命令行中,使用 scrapy 命令可以创建工程或启动爬虫,它控制着 Scrapy 的行为,我们称之为 Scrapy 命令行工具(command-line tool)或 Scrapy 工具(Scrapy tool).紧跟在 scrapy 命令之后的命令属于子命令(我们称之为"命令(commands)"或"Scrapy命令(Scrapy commands)",例如用于新建项目的 startproject 命令). Scrapy 工具包含许多命令,有各自的功能.参数

Windows 编程,程序编译使用的命令行工具。

Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件中包含了对程序中所使用资源(菜单.图标等)的描述.rc.exe将.rc格式的文件编译为.res文件,供链接器链接到可执行文件中. 3.link.exe是Windows平台的链接器,它将cl.exe编译生成的obj文件,资源编译器生成的.res文件,以及lib目录下的lib文件等链接成可执行的exe文

C#的命令行工具

?在最开始学java的时候我们一般用 记事本 + 命令行,在命令行里边进行编译和运行, C#也有类似的东西(csc工具),在学习C#语言的时候可以用 文本编辑器来编写代码,然后用C#的命令行工具来编译和运行 这个命令行工具的位置在: 开始-->所有程序-->Microsoft Visual Studio 2012 -->-->Visual Studio Tools --> VS2012开发人员命令提示 执行 csc  源代码.cs 这样就会在源代码的相同目录生成可执行文件

监控 Linux 性能的 18 个命令行工具

对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并运行是多么的不容易.基于此原因,我们已编写了最常使用的18个命令行工具列表,这些工具将有助于每个Linux/Unix 系统管理员的工作.这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因.这个命令行工具列表提供了足够的工具,您可以挑选适用于您的监控场景的工具. LitStone翻译于 2个月前 3人顶

监控 Linux 性能的 18 个命令行工具(转)

对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并运行是多么的不容易.基于此原因,我们已编写了最常使用的18个命令行工具列表,这些工具将有助于每个Linux/Unix 系统管理员的工作.这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因.这个命令行工具列表提供了足够的工具,您可以挑选适用于您的监控场景的工具. 1.Top-Linux进程监控 Linux