公眾號首發:https://mp.weixin.qq.com/s/N1JxiRnr5c4pq0RBo3RGYA
我在網上衝浪時,在 GitHub 上發現了一個感興趣的開源項目 OneX ,我將其下載到本地,現在我該如何知道這個項目的體量呢?一個非常直觀的指標是看這個項目有多少行代碼。
我們可以使用如下命令,來統計 OneX 項目代碼行數:
$ cd onex
$ find . -name "*.go" -print | xargs wc -l | tail -n 1
155784 total
截止目前,這個項目共計 155784 行 Go 代碼。
本文完。
scc
開個玩笑,接下來我將介紹一款強大的統計代碼行數的工具 scc 。
scc 是 Sloc、Cloc 和 Code 三個單詞的首字母縮寫,scc 是一款用 Go 編寫的速度飛快且準確的代碼統計工具,並且支持複雜度計算和成本估計。
可以通過如下命令來安裝 scc:
$ go install github.com/boyter/scc/v3@latest
如果你是 Mac 電腦,也可以使用 Homebrew 來安裝 scc:
$ brew install scc
使用 scc 統計 OneX 項目代碼行數:
scc 使用非常簡單,只需要進入到項目目錄,然後執行 scc 命令,即可實現統計。
scc 支持多種輸出格式,如 tabular(表格)、json、csv、html、sql 等,默認以表格的形式在命令行輸出統計結果,其輸出字段依次為:語言、文件數、總行數、空白行、註釋行、代碼行、複雜度。
以下是針對 scc 代碼統計結果的簡單分析:
一、核心指標解讀
-
語言分佈與代碼量
- Go 語言主導:佔比 76.5%(155,784/203,648 行),文件數 1,220 個,複雜度 11,382,是項目核心開發語言。
-
非代碼文件佔比:
- YAML/Markdown:佔 9.3%((12,390+6,510)/203,648 行),多為配置文件和文檔,説明此項目文檔齊全。
- Shell/Dockerfile/Makefile:佔 7.9%((13,346+778+1,920)/203,648 行),反映項目實現了容器化且自動化程度高。
- 代碼總量超過 14+ 萬行,説明這是一個大而全的超級項目。
-
代碼質量指標
- 註釋率:全局註釋佔比 16.2%(32,933/203,648 行),Go 語言註釋率 15.3%(23,859/155,784 行),符合健康標準(通常建議 10-20%)。
-
複雜度分析:
- Go 複雜度:平均每個文件 9.3 行(11,382/1,220 行)複雜代碼。
- Shell 複雜度:平均每個文件 9.6 行(789/82 行)複雜代碼,説明可能存在較為複雜的嵌套邏輯。
二、項目規模估算
-
COCOMO 模型結果
-
成本估算:
- 開發成本:$5,124,210。
- 時間估算:25.59 個月。
- 需要人數:需 17.79 人團隊。
-
當然,關於成本估算,我們可以通過 --avg-wage 參數修改人員的年平均工資(默認為 $56286);還可以通過參數 --cocomo-project-type 修改模型(默認為 organic),可以選擇 organic, semi-detached, embedded, "custom,1,1,1,1" 其中的一項。
-
實際代碼效率
- 千行代碼成本:$25.16(總成本 / 總代碼行數),反映代碼質量較高或團隊效率較好。
以上便是 scc 輸出結果的基本解讀。
scc 支持非常多的可選參數,你可以通過命令 scc -h 獲得幫助。這裏簡單介紹幾個常用選項:
$ scc ./src # 統計指定路徑
$ scc -l # 查看支持的語言和擴展名
$ scc -i go,java # 僅統計 Go 和 Java 文件
$ scc -f json # JSON 格式輸出
$ scc -f html > report.html # 生成可視化 HTML 報告
$ scc --format-multi="html:report.html,json:data.json" # 同時輸出多種格式,並寫入文件
$ scc --avg-wage=60000 # 自定義平均工資(默認 $56,286 美元)
此外,如果你想在統計 Go 代碼時忽略以 *_test.go 結尾的測試文件,則可以結合 git 來時先。
首先在 .gitignore 文件中加入如下配置項:
**/*_test.go
然後,再次執行 scc 命令即可在統計時忽略所有以 *_test.go 結尾的測試文件。
因為 scc 默認就會讀取 .gitignore 中的配置項,如果你想忽略 .gitignore 文件的作用,則可以執行如下命令:
# 指定參數 --no-gitignore 忽略 .gitignore 文件產生的副作用
$ scc --no-gitignore
cloc
除了 scc 工具,其實還有一個老牌的更加流行的工具 cloc 也可以用來統計代碼。cloc 使用 Perl 語言編寫,以下是使用 cloc 工具統計 OneX 項目代碼行數的輸出結果:
可以發現,與 scc 輸出結果略有差異,不過整體來説都比較準確。cloc 最大的問題是慢,從速度角度來説,確實 scc 速度更快,體驗更好。針對 OneX 項目代碼統計,scc 幾乎瞬間完成,而 cloc 則需要 40+ 秒才統計完成。
總結
scc 是一款用 Go 編寫的速度飛快且準確的代碼統計工具,並且支持複雜度計算和成本估計。通過使用 scc,一行命令我們就可以統計代碼行數。
以下是我用 Hunyuan 大模型幫我生成的 scc 與其他主流代碼統計工具的對比表格:
| 工具 | 語言 | 核心功能 | 優勢 | 侷限性 |
|---|---|---|---|---|
| scc | Go | 代碼行數、複雜度、COCOMO 估算 | 速度最快(百萬行級處理) | 功能相對單一 |
| cloc | Perl | 代碼行數、註釋、空白行 | 支持更多非代碼文件(如二進制) | 統計速度較慢 |
| tokei | Rust | 語言分類統計 | 支持 200+ 語言,內存佔用低 | 無複雜度分析功能 |
僅供參考。
希望此文能對你有所啓發。
延伸閲讀
- OneX GitHub 源碼:https://github.com/onexstack/onex
- scc GitHub 源碼:https://github.com/boyter/scc
- cloc GitHub 源碼:https://github.com/AlDanial/cloc
- tokie GitHub 源碼:https://github.com/XAMPPRocky/tokei
- 構造性成本模型(COCOMO):https://zh.wikipedia.org/wiki/構造性成本模型
- 本文永久地址:https://jianghushinian.cn/2025/05/17/scc/
聯繫我
- 公眾號:Go編程世界
- 微信:jianghushinian
- 郵箱:jianghushinian007@outlook.com
- 博客:https://jianghushinian.cn
- GitHub:https://github.com/jianghushinian