今天發現一個特別好用的工具 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
它有諸多優點:
- 下載安裝方便。
- 能識別多種語言。
- 允許通過項目或語言等多種方式來輸出統計結果。
- 多種輸出格式,包括純文本、SQL、JSON、XML、YAML 等。
- 能直接從壓縮包裏統計代碼。
- 多種排錯選項。
- 識別含有非常用字符和空格的文件、目錄名。
- 沒有外部依賴。
- 可在多種系統上運行。
由於它出色的靈活性,可以和多種工具結合使用。
比如寫一個 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 的業務數據可視化的項目,前端代碼佔的比重稍大了一點。