今天发现一个特别好用的工具 cloc,可以用它统计代码的行数。它可以识别多种开发语言,并在计算的时候忽略掉注释和空行。
我记得我上次申请软件著作权的时候,申请表格中要求提交代码量,当时为了计算行数,我写了类似于 find xxx -prune xxx | xargs grep -vE xxx | wc -l
的超长命令。
每年写年终总结统计工作量的时候,我也常常会用到类似的命令。
所以我今天突然发现这个工具的时候,还是很惊喜的。
在 macOS 上,可以通过 brew install cloc
来安装它,它支持包括 Windows 在内的多个系统。
它有诸多优点:
- 下载安装方便。
- 能识别多种语言。
- 允许通过项目或语言等多种方式来输出统计结果。
- 多种输出格式,包括纯文本、SQL、JSON、XML、YAML 等。
- 能直接从压缩包里统计代码。
- 多种排错选项。
- 识别含有非常用字符和空格的文件、目录名。
- 没有外部依赖。
- 可在多种系统上运行。
由于它出色的灵活性,可以和多种工具结合使用。
比如写一个 cloc-git 的脚本,用来统计 git 远程项目的代码量。
运行结果如下:
cloc 也支持使用 --diff
选项对两个版本的代码量进行比较。
但是在我尝试 cloc 使用 --diff
选项比较文件并输出结果的时候, 我发现了一个问题,cloc 输出的 yaml 或 json 文件内容是不正确的。如下所示:
这是 diff 输出的 yaml 文件。注意 same 下面的 key 并不是根据开发语言区分的二级 Hash,而是所有结果都使用了同样的 key 名放在了一起。这样如果有其他工具读取输出文件,势必会导致前面同名 key 的值被后面的值覆盖。造成解析后会丢失绝大部分的报告内容。
这个问题我已经在项目提交了Issue,作者说过几天就将修复这个问题。
最后统计了一下我最近在做的项目。
$ cloc .
365 text files.
339 unique files.
225 files ignored.
github.com/AlDanial/cloc v 1.70 T=9.31 s (16.3 files/s, 2338.0 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
YAML 7 13 47 14366
JavaScript 38 1 131 2177
Ruby 72 396 728 1281
CoffeeScript 7 148 29 1192
SASS 4 34 19 347
ERB 16 60 0 250
Markdown 2 143 0 182
HTML 3 15 3 182
CSS 3 2 25 2
-------------------------------------------------------------------------------
SUM: 152 812 982 19979
-------------------------------------------------------------------------------
最多的 YAML 代码是从业务库导出的基线数据。由于这是个基于 echarts 的业务数据可视化的项目,前端代码占的比重稍大了一点。