转自:使用 cloc 统计你的代码量
今天发现一个特别好用的工具 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
它有诸多优点:
由于它出色的灵活性,可以和多种工具结合使用。
比如写一个 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 的业务数据可视化的项目,前端代码占的比重稍大了一点。