使用 cloc 统计你的代码量

Posted by Echo on September 24, 2016

今天发现一个特别好用的工具 cloc,可以用它统计代码的行数。它可以识别多种开发语言,并在计算的时候忽略掉注释和空行。

我记得我上次申请软件著作权的时候,申请表格中要求提交代码量,当时为了计算行数,我写了类似于 find xxx -prune xxx | xargs grep -vE xxx | wc -l 的超长命令。

每年写年终总结统计工作量的时候,我也常常会用到类似的命令。

所以我今天突然发现这个工具的时候,还是很惊喜的。

在 macOS 上,可以通过 brew install cloc 来安装它,它支持包括 Windows 在内的多个系统。

npm install -g cloc                    # https://www.npmjs.com/package/cloc
sudo apt-get install cloc              # Debian, Ubuntu
sudo yum install cloc                  # Red Hat, Fedora
sudo dnf install cloc                  # Fedora 22 or later
sudo pacman -S cloc                    # Arch
sudo pkg install cloc                  # FreeBSD
sudo port install cloc                 # Mac OS X with MacPorts
brew install cloc                      # Mac OS X with Homebrew
choco install cloc                     # Windows with Chocolatey

它有诸多优点:

  1. 下载安装方便。
  2. 能识别多种语言。
  3. 允许通过项目或语言等多种方式来输出统计结果。
  4. 多种输出格式,包括纯文本、SQL、JSON、XML、YAML 等。
  5. 能直接从压缩包里统计代码。
  6. 多种排错选项。
  7. 识别含有非常用字符和空格的文件、目录名。
  8. 没有外部依赖。
  9. 可在多种系统上运行。

由于它出色的灵活性,可以和多种工具结合使用。

比如写一个 cloc-git 的脚本,用来统计 git 远程项目的代码量。

#!/usr/bin/env bash
git clone --depth 1 "$1" temp-linecount-repo &&
  printf "('temp-linecount-repo' will be deleted automatically)\n\n\n" &&
  cloc temp-linecount-repo &&
  rm -rf temp-linecount-repo

运行结果如下:

$ cloc-git https://github.com/rails/rails.git
Cloning into 'temp-linecount-repo'...
remote: Counting objects: 3615, done.
remote: Compressing objects: 100% (3048/3048), done.
remote: Total 3615 (delta 174), reused 1576 (delta 52), pack-reused 0
Receiving objects: 100% (3615/3615), 6.08 MiB | 2.28 MiB/s, done.
Resolving deltas: 100% (174/174), done.
Checking connectivity... done.
('temp-linecount-repo' will be deleted automatically)


    3043 text files.
    2893 unique files.
     309 files ignored.

github.com/AlDanial/cloc v 1.70  T=19.61 s (141.1 files/s, 18560.1 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Ruby                          2152          47525          41996         213275
Markdown                        74          13832              0          34880
JavaScript                      23            732            747           3385
YAML                           144            307            584           2505
ERB                            318            248             11           1736
CSS                             20            157            120           1105
CoffeeScript                    11             87            104            318
HTML                            19             15              3            198
yacc                             1              4              0             45
SQL                              1              6              0             43
JSON                             1              0              0             24
builder                          2              0              0              6
DTD                              1              0              0              1
-------------------------------------------------------------------------------
SUM:                          2767          62913          43565         257521
-------------------------------------------------------------------------------

cloc 也支持使用 --diff 选项对两个版本的代码量进行比较。

但是在我尝试 cloc 使用 --diff 选项比较文件并输出结果的时候, 我发现了一个问题,cloc 输出的 yaml 或 json 文件内容是不正确的。如下所示:

---
# github.com/AlDanial/cloc
header :
...

same :
    language : CSS
    files_count : 3
    blank : 0
    comment : 25
    code : 2
    language : JavaScript
    files_count : 38
    blank : 0
    comment : 131
    code : 2177
    language : HTML
    files_count : 3
    blank : 0
    comment : 3
    code : 182
...

这是 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 的业务数据可视化的项目,前端代码占的比重稍大了一点。