一般開發者或許沒有程式碼統計的習慣, 在開發過程中, 我們可能很少注意整個 Project 的程式碼行數. (反正能跑就好😂)
但當遇到要部署, 團隊合作互相檢視進度, 又或者有軟體法律問題發生時, 程式碼統計就很重要了.
而且養成習慣後, 就不會容許有一個人豪邁地寫幾萬行 Javascript 這種事情發生. 😄😄
wc
IDE (VS, Xcode, Eclipse) 可能會有內建的統計 plugin 來瞭解專案的開發進度,
而在 terminal 下, 用家可以很簡單地用 wc (word count) 算目前目錄底下檔案的行數, 比如:
$ wc -l ./*
不過這只能看一個目錄下的檔案, 當然我們可以搭配其他 command 用 pipe 做一個更好的工具出來, 但其實已經有人做出很好的 OpenSource 工具了 😄
Cloc 簡介:
以前我會使用一個叫 Cloc 的工具,
它是一款用 Perl 實作的工具, 安裝十分方便 (實際上只是一支 Perl script), 能識別和支援的語言種類很多, 而且能跨平台使用 (Perl).
以這個的 Blog 的程式碼為例:
71 text files.
71 unique files.
9 files ignored.
github.com/AlDanial/cloc v 1.72 T=0.16 s (389.0 files/s, 38917.5 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
JavaScript 6 599 230 1702
CSS 7 182 240 1451
HTML 38 142 241 930
Markdown 8 153 0 286
YAML 4 16 16 115
-------------------------------------------------------------------------------
SUM: 63 1092 727 4484
-------------------------------------------------------------------------------
Cloc 預設會遍歷每個子目錄, 識別所有的檔案, 把其中的 blank, comment, code lines 都按欄位印出來, 而三個欄位加起來就是總行數.
Cloc 還支援其他很多功能, 包括排除指令, 多種輸出格式 (XML, YAML …) 等, 應該已經符合平常使用的要求.
不過 Cloc 始終是一支 Perl script.
這邊以我 2017 的工作目錄來做統計, 再用 time 算時間:
$ time cloc ~/workspace
.....
---------------------------------------------------------------------------------------
SUM: 28819 1339834 1593955 6908299
---------------------------------------------------------------------------------------
cloc ~/workspace 76.23s user 15.58s system 73% cpu 2:04.80 total
共花了 2 分鐘的時間, 在數量級為百萬行的目錄下, Cloc 花費的時間要以分鐘為單位.
tokei 簡介:
Linux 使用的 package mangemant system 會有類似 software 的推薦,
於是我便偶然間發現了 tokei 這個工具. 😄
安裝 tokei
目前 tokei 還沒有支援很多的平台直接安裝,
- Archlinux 和 Fedora 用戶可以直接安裝:
|
|
不過最推薦的做法是使用 Cargo 來自行建置, 利用 Rust 跨平台的特性, tokei 也能很簡單安裝在 Windows, macOS 上.
# Build directly.
$ cargo install tokei
# Or clone From github.
$ git clone https://github.com/Aaronepower/tokei.git
$ cd tokei
$ cargo build --release
# sudo mv target/release/tokei /usr/local/bin
使用 tokei
tokei 的功能和 Cloc 其實大同小異:
再以這個 Blog 為例:
-------------------------------------------------------------------------------
Language Files Lines Code Comments Blanks
-------------------------------------------------------------------------------
CSS 7 1873 1451 240 182
HTML 38 1313 672 499 142
JavaScript 6 2531 1744 188 599
Markdown 8 456 456 0 0
TOML 3 210 151 28 31
YAML 3 118 92 14 12
-------------------------------------------------------------------------------
Total 65 6501 4566 969 966
-------------------------------------------------------------------------------
tokei 默認印出現行目錄下 Lines (總行數), Code, Comment, Blanks 的欄位, 就輸出介面訊息來說比 Cloc 更友善一點,
如果你要忽略某種檔案類型, 你可以用 –execulde flag.
比如我專案下有很多類型的檔案, 想要去掉所有的 HTML.
$ tokei . --exclude *.html
這樣子就可以自訂想要統計要那幾種檔案的類型, 方便之後統整, 繪圖使用.
tokei 加上 –files flags 後就可以印出所有目錄下的檔案及其名稱.
$ tokei . --files
也可以加上 -v (verbose) flag, 看 error 和 warning:
$ tokei . -v
詳細用法可以看 –help
$ tokei --help
tokei 雖然和 Cloc 功能上有重疊, 但 tokei 最大的優勢是用 Rust 實作, 單一執行檔的效能比 Cloc 要快上幾倍.
舉例以我 2017 的工作目錄來做統計:
$ time tokei ~/workspace
.....
-------------------------------------------------------------------------------
Total 29214 9770495 7220769 1244609 1305117
-------------------------------------------------------------------------------
tokei ~/workspace 7.28s user 0.36s system 98% cpu 2.397 total
雖然 CPU 使用率變高, 但約 9 百萬行的專案, 只花了約 2s 多的時間, 效能上差距很大 !!
總結:
tokei 目前功能比較少 (少了檔案 diff etc.) 和安裝 (依賴 Rust) 上比較麻煩.
如果你會使用 Rust 和 Cargo, 那安裝上並沒有很大的問題.
而細心的讀者到這里一定發現, 為什麼 Cloc 和 tokei 出來的結果並不相同 😂
依照它們 document 的說法, Cloc 支援的檔案類型比 tokei 要多 100 種左右.
可是 tokei 有支援一些新的檔案類型, 比如 .toml, .txt 等 plain text 檔.
雖然兩個工具計算出的總行數的數量級是一樣的, 但使用時一定要注意各自支援的檔案類型 !!
Cloc 有 –include-lang= 這個 flag.
tokei 則可以自行寫一支 script, 來截取想要的檔案類型結果.
比如可以自行用 grep 來取得想要的類型行數,
$ tokei . | grep "HTML" | awk ...
注意事項:
- 目前 tokei 還是一個很新的工具, 潛在的 bug 也不少, 比如之前有 ruby 特有的注解(=begin =end) 統計錯誤等問題.
- 個人測試過, 目前 C/C++, Java, Javascript, Rust, Markdown, CSS, JSON, cmake 等檔案, 結果準確度沒有問題.
- 如果你十分註重統計數據的準確度, 而且不在意效能和時間, 想用來建報表, 那麼 Cloc 可能比較合適.
- 但如果你只是要大概了解專案現在的程式碼數據, 團隊討論用, 那會建議你用 tokei 快速得出結果. 😄
- 此外, 同類型的工具其實不少, 還有同樣用 Rust 做的, 聲稱最快的 loc, 有興趣可以去試用 😂😂
Reference:
- Cargo
這不是 Rust 推介文 😂😂