gocloc - fast cloc implementation

cloc のGo実装 gocloc をリリースしました。

使い方

$ go get -u -v github.com/hhatto/gocloc
$ gocloc .
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Go                               8             97             16            810
Bourne Shell                     9             65            161            270
Markdown                         1             20              0            144
YAML                             1              2              0              8
-------------------------------------------------------------------------------
TOTAL                           19            184            177           1232
-------------------------------------------------------------------------------

パフォーマンス

このあたり にあります。割と高速です。

経緯

Rustの関連の情報収集していたらTokeiという和名なタイトル が目を引いて、 ちょうど使っているツール cloc のRust実装ということで超高速らしいので使ってみました。

少し使ってみるとclocと結構動作が異なっていたので、Rustの勉強兼ねていくつかパッチを送りました。

上の3つが取り込まれて、自分の興味のある部分なので継続してパッチ送ってみようと思ったのですが、 最後のパッチが取り込まれなかったりして、開発のペース少し遅そうだなということでGoの実装作ってみました。

tokei わりと個人のプロジェクトっぽいので、特にパッチが取り込まれなかったことは気にしていなくて、 clocより高速を謳い文句にした同じようなツールをはじめるのもなぁというところのほうを気にしてました。 が、まぁこっちも個人のプロジェクトで自由に開発したいなというところで gocloc 作った次第です。

Jenkinsと組み合わせる

SLOCCount Plugin を使います。

前述のプラグインのページにclocで出力した結果を使う方法は記載しているのですが、軽く紹介しておきます。

clocの場合

事前に、プラグインページにある cloc2sloccount.xsl を別途作成して、 xsltproc をインストールしておきます。

$ vim cloc2sloccount.xsl
$ brew install xsltproc

で、計測してclocの結果からsloccountの結果に変換します。

$ cloc --by-file --xml --out=cloc.result.xml .
$ xsltproc cloc2sloccount.xsl cloc.result.xml > sloccount.result

この sloccount.result をSLOCCount Pluginの結果ファイルに指定して準備は完了です。 あとはビルド実行で以降、いい感じなチャートが表示されます。

goclocの場合

xsltproc を実行するのが一手間かかってしまうので、goclocでは --output-type=sloccount を指定できるようにしました。

$ gocloc --by-file --output-type=sloccount . >  sloccount.result

goclocではこれで準備が整います。 あまり必要なさそうですが、 --output-typecloc-xml を指定することで cloc形式のXMLで出力も可能です。

最後に

Goで実装していますが、goroutineも使っておらず素直な実装で、割と高速に動作していて満足してます。 今後は足りないオプションやサポート言語の追加をマイペースで行っていく予定です。

よければ使ってみてください。プルリク等もお待ちしています。

では。