はじめに・・・
最近規模が大きめなソースコード読むことが増えてきたため,自宅のMacbook ProにOpenGrokを入れてみたという記事です.
会社でもガッツリ使っていて、コードリーディングが非常に楽になります.
皆さん、是非使ってみては如何でしょうか?
開発環境
MacOS High Sierra 10.13.2
OpenGrok 1.1-rc70
Homebrew
Python 3.6.0
JDK 11
Tomcat 8(最新版でも問題ないと思うが,諸事情に8を使用)
Ctags
好きなブラウザ(私はChromeを使用)
作業ディレクトリ
今回作業を行うディレクトリは下記の通りです.
WORK_DIR=~/Documents/Qiita/OpenGrok
事前準備
環境構築
必要なモノをインストールします.(Homebrewはインストール済みを想定しています.)
# Tomcatのインストール
$brew install tomcat@8
# Ctagsのインストール
$brew install --HEAD universal-ctags/universal-ctags/universal-ctags
OpenGrokの準備
https://github.com/oracle/opengrok/releases
上記URLから,今回は1.1-rc70のバイナリターボール(opengrok-1.1-rc70.tar.gz)を取ってきます.
※ソースコードではないのでご注意
取得したopengrok-1.1-rc70.tar.gzを作業ディレクトリに展開します.
# ダウンロード先に移動
$cd ${opengrok-1.1-rc70.tar.gzのダウンロードされたディレクトリ}
# WORK_DIRに展開
$tar xfvz opengrok-1.1-rc70.tar.gz -C $WORK_DIR
OpenGrokの設定
OpenGrok-Toolのビルド
OpenGrokは処理を行うために様々なコマンドを用意しています.
今回はそのコマンドのPythonラッパーを使用します.
具体的な手順は,OpenGrokが用意してくれているドキュメントを参照することをオススメします.
ここでは必要最低限の準備しません.
# 上で展開したOpenGrokのディレクトリに入る
$cd $WORK_DIR opengrok-1.1-rc70
# toolsの中に入り,opengrok-tools.tar.gzを展開し,その中に入る
$tar xfvz opengrok-tools.tar.gz
$cd opengrok-tools-1.1rc70
# ここからPythonの処理に入るので,仮想環境を準備
$python3 -m venv env
$. env/bin/activate
# ビルドに必要なものをインストールする.
$python -m pip install -r opengrok_tools.egg-info/requires.txt
# ビルドとインストール
$python setup.py develop
$export PYTHONPATH=`pwd`/src/main/python:$PYTHONPATH
$python setup.py install
# インストールされたか確認
$opengrok-groups
usage: opengrok-groups [-h] [-D] [-j JAVA] [-J JAVA_OPTS] [-e ENVIRONMENT]
(-a JAR | -c CLASSPATH)
options [options ...]
opengrok-groups: error: the following arguments are required: options
$opengrok-sync ✘ 2
usage: opengrok-sync [-h] [-w WORKERS]
[-d DIRECTORY | -P [PROJECTS [PROJECTS ...]]] [-I] [-D]
[-i [IGNORE_ERRORS [IGNORE_ERRORS ...]]] -c CONFIG
[-U URI]
opengrok-sync: error: the following arguments are required: -c/--config
これでOpenGrokのツールをインストールできました.
デプロイ
ビルドが済んだのでTomcatへのデプロイを行います.
tomcatのバージョンによって,ファイルパスが変わるので注意してください.(下記は私の環境の場合です)
# Tomcatのwebappに.warファイルをデプロイする.
$opengrok-deploy $WORK_DIR/opengrok-tools-1.1rc70/lib/source.war /usr/local/Cellar/tomcat@8/8.5.34/libexec/webapps
コードリーディングするソースコードの準備
OpenGrokで見るソースコードの準備を行います.
適当なソースコードを今回は準備します.
# 適当なソースコードを準備
$ll -R NMF_for_cpp-master
total 80
-rwxr-xr-x@ 1 t_sumida staff 3.8K 3 2 2018 Array2D.hpp
-rwxr-xr-x@ 1 t_sumida staff 214B 3 2 2018 CMakeLists.txt
-rwxr-xr-x@ 1 t_sumida staff 6.9K 3 2 2018 NMF.hpp
-rwxr-xr-x@ 1 t_sumida staff 904B 3 2 2018 README.md
-rwxr-xr-x@ 1 t_sumida staff 12K 3 2 2018 Separator.h
-rwxr-xr-x@ 1 t_sumida staff 1.1K 3 2 2018 main.cpp
# OpenGrokで使うディレクトリを作成する.
$sudo mkdir /var/opengrok/src
$sudo mkdir /var/opengrok/data
$sudo mkdir /var/opengrok/etc
インデキシング
最後にインデキシングを行い,Tomcatを起動していきます.
# ソースコードを/var/opengrok/srcにコピーする
$cp -r NMF_for_cpp-master /var/opengrok/src
# インデキシングを実行(規模によっては時間がかかる)
sudo opengrok-indexer -a $WORK_DIR/opengrok-1.1-rc70/lib/opengrok.jar -- \
-s /var/opengrok/src -d /var/opengrok/data -H -P -S -G \
-W /var/opengrok/etc/configuration.xml -U http://localhost:8080
# Tomcatを起動
$catalina start
$catalina run
使ってみる
Tomcatが起動した後に,
http://localhost:8080/source/
をブラウザで開くと,下のような画面になっている.
使い方に関しては,チートシートなどがその辺に転がってるので参照してください.
「この関数がどこで定義されていて,どこで使われているのか?」
「この定義を色付けしておきたい!」
など様々なことが出来ますよ.
運用
今後他にも見たいソースコードがあるなら,インデキシングを毎回行ってください.
CやC++,Java, Pythonに対応しているので色々試してみてください.
※インデキシング時のコマンドを少し変える必要があると思いますが・・・
最後に・・・
会社で使ってて便利だと思ったので,自宅のMacにもOpenGrokを入れてみました.
研究室の古いソースコードとか,プロジェクト単位で登録すれば色々便利かもしれないです.