clocの使い方!ソースコードの行数を計測してみよう!

プロジェクトの規模を把握したり、開発の進捗を可視化したりする際に、ソースコードの行数を計測したいことがあります。そんなときに便利なのが『cloc(Count Lines of Code)』というツールです。

git diffでも各ファイルの追加・削除した行数を計測できますが、clocを使うとより詳細に計測できます。

この記事では『cloc』について、以下の内容をわかりやすく解説します。ご参考になれば幸いです。

  • clocとは
  • clocのインストール方法
  • clocの使い方
    • 現在のディレクトリのコード行数を計測
    • 特定のディレクトリのコード行数を計測
    • 特定のファイルのコード行数を計測
    • 特定の拡張子のコード行数を計測
    • 特定のディレクトリを除外してコード行数を計測
    • 特定の拡張子を除外してコード行数を計測
    • 特定のファイルを除外してコード行数を計測
    • 圧縮ファイル(zip, tar, gzip)のコード行数を計測
    • 計測したコード行数をCSVで出力
    • ファイル単位でコード行数を計測
    • Gitリポジトリのコード行数を計測
    • GitのコミットID時点でのコード行数を計測
    • 過去のコミットとのコード差分を計測
  • clocの出力結果の見方

clocとは

cloc(Count Lines of Code)は、ソースコードの行数を計測するツールです。単なる行数ではなく、コメント行、空行、実際のコード行(論理LOC)を区別して計測してくれるため、多くの開発者に利用されています。

clocの特徴

  • プログラミング言語ごとにソースコードの行数を分類してくれる
  • 「コメント行」「空行」「実コード行(論理LOC)」を区別して計測できる
  • 圧縮ファイルのソースコード行数も計測できる
  • Gitリポジトリのソースコード行数も計測できる
    • コミット間のソースコード行数の差分を計測できる
    • 過去のコミット時点のソースコード行数を計測できる
  • CSV、JSON、YAMLなどの形式でデータを出力できる

clocのインストール方法

clocは複数の方法でインストールできますが、ここではnpmを使用してインストールします。Node.jsがインストールされていれば、以下のコマンドでclocをインストールできます。

npm install -g cloc

clocのインストール後、以下のコマンドでバージョンを確認できます。

cloc --version

その他のインストール方法

MacではHomebrewを使用してインストールします。以下のコマンドを実行するとclocをインストールできます。

brew install cloc

Ubuntuでは以下のコマンドを実行するとclocをインストールできます。

sudo apt install cloc

それぞれの環境に合わせて、上記のコマンドを実行してください。なお、詳細なインストール方法については、公式リポジトリを参照してください。

clocの使い方

ではこれから、clocの様々な使い方について説明します。

現在のディレクトリのコード行数を計測

以下のコマンドを実行すると、現在のディレクトリ(.)にあるファイルのソースコード行数を計測できます。

cloc .

特定のディレクトリのコード行数を計測

例えば、srcディレクトリ内のソースコード行数を計測したい場合、以下のコマンドを実行します。

cloc src

特定のファイルのコード行数を計測

例えば、index.jsのソースコード行数を計測したい場合、以下のコマンドを実行します。

cloc index.js

srcディレクトリ内のindex.jsのソースコード行数を計測したい場合には、以下のコマンドを実行します。

cloc src/index.js

特定の拡張子のコード行数を計測

特定の拡張子のファイルだけを対象にしてソースコード行数を計測したい場合は、--include-extオプションを使います。

例えば、srcディレクトリ内のJavaScript(.js)とTypeScript(.ts)ファイルのソースコード行数を計測したい場合、以下のコマンドを実行します。

cloc --include-ext=js,ts src

特定のディレクトリを除外してコード行数を計測

特定のディレクトリを除外してソースコード行数を計測したい場合は、--exclude-dirオプションを使います。

例えば、現在のディレクトリ(.)内のnode_modulesdistディレクトリを除外して、ソースコード行数を計測したい場合、以下のコマンドを実行します。

cloc --exclude-dir=node_modules,dist .

特定の拡張子を除外してコード行数を計測

特定の拡張子のファイルを除外してソースコード行数を計測したい場合は、--exclude-extオプションを使います。

例えば、現在のディレクトリ(.)内の.html.cssファイルを除外して、ソースコード行数を計測したい場合、以下のコマンドを実行します。

cloc --exclude-ext=html,css .

特定のファイルを除外してコード行数を計測

特定のファイルを除外してソースコード行数を計測したい場合は、--exclude-list-fileオプションを使います。

まず、除外したいファイルリストを作成します。

echo "README.md" >> exclude-files.txt
echo "src/App.test.js" >> exclude-files.txt

例えば、現在のディレクトリ(.)にあるファイルのソースコード行数を計測する際に、上記で記述したファイルを除外したい場合、以下のコマンドを実行します。

cloc --exclude-list-file=exclude-files.txt .

圧縮ファイル(zip, tar, gzip)のコード行数を計測

圧縮ファイル内のソースコード行数を解析することも可能です。以下のコマンドを実行すると、my_project.zipmy_project.tar.gz内のソースコード行数を計測できます。

cloc my_project.zip
cloc my_project.tar.gz

計測したコード行数をCSVで出力する方法

計測したソースコード行数をCSVで出力したい場合は、--csvオプションを使います。

例えば、現在のディレクトリ(.)にあるファイルのソースコード行数を計測する際に、CSV形式で出力したい場合、以下のコマンドを実行します。

cloc --csv .

上記のコマンドを実行すると、以下に示すようにCSV形式の出力がターミナル(標準出力)に表示されます。

cloc --csv .
      14 text files.
      14 unique files.
       4 files ignored.

files,language,blank,comment,code,"github.com/AlDanial/cloc v 2.04  T=0.13 s (105.7 files/s 123278.8 lines/s)"
3,JSON,0,0,16095
5,JavaScript,6,7,55
2,CSS,6,0,45
1,Markdown,32,0,38
1,HTML,3,20,20
1,Text,0,0,3
1,SVG,0,0,1
14,SUM,47,27,16257

CSVファイルとして保存したい場合は、リダイレクト>を使って出力結果をファイルに保存します。以下のコマンドではcloc_output.csvというファイルに出力結果を保存しています。

cloc --csv . > cloc_output.csv

ファイル単位でコード行数を計測

ファイル単位でソースコード行数を計測したい場合は、--by-fileオプションを使います。

例えば、現在のディレクトリ(.)にあるファイルのソースコード行数を計測する際に、ファイル単位でソースコード行数を計測したい場合、以下のコマンドを実行します。

cloc --by-file .

Gitリポジトリのコード行数を計測する

例えば、オープンソースのJavaScriptライブラリlodashのリポジトリをクローンし、そのソースコード行数を計測するには、以下の手順を実行します。

# lodash のリポジトリをクローン
git clone https://github.com/lodash/lodash.git

# クローンしたディレクトリに移動
cd lodash

# ソースコード行数を計測
cloc .

GitのコミットID時点でのコード行数を計測

引数にコミットIDを渡すことで、その時点でのソースコード行数を計測できます。

cloc --git <コミットID>
例: 特定のコミット f42859a15c39f0efd28382e7e7031895247cc085 時点でのソースコード行数を計測する場合
cloc --git f42859a15c39f0efd28382e7e7031895247cc085

過去のコミットとのコード差分を計測

過去のコミットとのソースコード差分を計測するためには、以下のコマンドを実行します。

cloc --diff <コミットID1> <コミットID2>
例
cloc --diff 1144918f3578a84fcc4986da9b806e63a6175cbb 059a26260610ee2878e4929ec3adcc880b43c313

<コミットID1>が過去(古いコミット)、<コミットID2>が現在(新しいコミット)になります。

clocの出力結果の見方

clocの出力結果は以下のようになります。

$ cloc  .
      14 text files.
      14 unique files.
       3 files ignored.

github.com/AlDanial/cloc v 2.04  T=0.12 s (114.0 files/s, 132982.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
JSON                             3              0              0          16095
JavaScript                       5              6              7             55
CSS                              2              6              0             45
Markdown                         1             32              0             38
HTML                             1              3             20             20
Text                             1              0              0              3
SVG                              1              0              0              1
-------------------------------------------------------------------------------
SUM:                            14             47             27          16257
-------------------------------------------------------------------------------

各列の意味

  • Language:プログラミング言語
  • files:その言語のファイル数
  • blank:空行の数
  • comment:コメント行の数
  • code:実際のコード行の数

files ignoredはコード計測していないファイルの数です。clocではpngファイルやicoファイルは無視するので、そのようなファイルがあればfiles ignoredにカウントされますし、--exclude-extオプション等で除外したファイルがあれば、files ignoredにカウントされます。

また、コミット間のコード差分を計測した場合、clocの出力結果は以下のようになります。

$ cloc --diff 1144918f3578a84fcc4986da9b806e63a6175cbb 059a26260610ee2878e4929ec3adcc880b43c313
      11 text files.
      12 text files.
       2 files ignored.

github.com/AlDanial/cloc v 2.04  T=25.51 s (0.4 files/s, 2140.2 lines/s)       
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
JavaScript
 same                            0              0          13104          26881
 modified                        5              0              6            142
 added                           0             18             41             54
 removed                         0              0              0              1
Markdown
 same                            0              0            686           7278
 modified                        2              0              0            322
 added                           1             10              0             25
 removed                         0              0              0              0
JSON
 same                            0              0              0           5897
 modified                        2              0              0              6
 added                           0              0              0              8
 removed                         0              0              0              0
YAML
 same                            0              0              8            104
 modified                        1              0              1              4
 added                           0              0              0              0
 removed                         0              0              0              0
-------------------------------------------------------------------------------
SUM:
 same                            0              0          13798          40160
 modified                       10              0              7            474
 added                           1             28             41             87
 removed                         0              0              0              1
-------------------------------------------------------------------------------

各行の意味

  • same:変更されていない行数
  • modified:変更された行数(元のコードが修正された)
  • added:新しく追加された行数
  • removed:削除された行数

本記事のまとめ

この記事では『文字を入力する』について、以下の内容を説明しました。

  • clocはソースコードの行数を計測するツール
  • 特徴
    • 言語ごとに分類(コメント・空行・実コード行を区別)
    • 圧縮ファイルやGitリポジトリも計測可能
    • コミット時点や差分の計測ができる
    • CSV/JSON/YAML形式で出力可能
  • インストール方法
    • npm: npm install -g cloc
    • Homebrew(Mac): brew install cloc
    • Ubuntu: sudo apt install cloc
  • clocの使い方
    • 現在のディレクトリ: cloc .
    • 特定のディレクトリ: cloc src
    • 特定のファイル: cloc index.js
    • 特定の拡張子: cloc --include-ext=js,ts src
    • 特定のディレクトリを除外: cloc --exclude-dir=node_modules,dist .
    • 特定の拡張子を除外: cloc --exclude-ext=html,css .
    • 特定のファイルを除外: cloc --exclude-list-file=exclude-files.txt .
    • 圧縮ファイル(zip, tar, gzip): cloc my_project.zip
    • CSVで出力: cloc --csv .
    • ファイル単位: cloc --by-file .
    • GitのコミットID時点: cloc --git <コミットID>
    • 過去のコミットとのコード差分: cloc --diff <コミットID1> <コミットID2>

お読み頂きありがとうございました。