OpenGrok + Universal ctags

OpenGrok 环境搭建踩坑。

不知道 OpenGrok 自己放 Google ,为何选它不选 Source Insight 或者 Source Navigator 也请自己查。

安装时,服务器上已有 JDK 和 Tomcat,这部分直接跳过。

Ctags

Exuberant V.S. Universal

OpenGrok 官方 Requirements

前两个就不说。原打算装 Exuberant Ctags(以下简称EC) ,结果看到知乎上大家讨论,说Universal Ctags (以下简称UC)更好。

官网在此 http://ctags.io/

简单说,就是 EC 托管在 SourceForge 不再活跃了,UC 作为 Fork 接过接力棒,继续开发。


autogen.sh runs autoreconf internally. If you use a (binary oriented) GNU/Linux distribution, autoreconf may be part of the autoconf package. In addition you may have to install automake and/or pkg-config, too.

源码编译安装

官方提醒 autogen.sh 脚本里面调用了 autoreconf ,先安装 automake

1
$ sudo apt-get install automake # ubuntu, centos 用 yum

然后跟着官方走:

1
2
3
4
5
6
7
8
9
10
$ git clone https://github.com/universal-ctags/ctags.git
$ cd ctags
$ ./autogen.sh
$ ./configure --prefix=/where/you/want # defaults to /usr/local
configure.ac:120: error: possibly undefined macro: AC_DEFINE
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:342: error: possibly undefined macro: AC_MSG_ERROR
configure.ac:596: error: possibly undefined macro: AS_IF
autoreconf: /usr/bin/autoreconf failed with exit status: 1

报错,几个宏找不到。用这几个错误搜索,有人说这个包那个包,最后发现是 pkg-config 解决掉:

1
$ sudo apt-get install pkg-config

是不是很眼熟?是的,一开始那段提醒里就已经提到,因为 写着 or ,没当回事。安装完就不再报错了。

1
2
3
4
5
6
7
8
9
10
11
$ ./autogen.sh
$ ./configure --prefix=/where/you/want # defaults to /usr/local
$ make
$ make install # may require extra privileges depending on where to install
$ ctags --version
Universal Ctags 0.0.0(d2efd07), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
Compiled: Feb 15 2017, 15:19:35
URL: https://ctags.io/
Optional compiled features: +wildcards, +regex, +option-directory, +coproc

UC 安装完毕。

OpenGrok

初次索引

OpenGrok 分两个主要部分:

  1. index 生成工具
  2. 搜索查询的 webapp

下载之后,解压目录主要都是 1) ,llib/ 目录下的 source.war 则是 2)。

war 包直接放到 Tomcat 的 webapp 目录即可 通过 http://path/to/tomcat/source/ 访问,只不过现在没有项目。

index 工具部分,主要是 lib/ 下的 opengrok.jar 和 bin/ 下的 OpenGrok 脚本。

网上大家讨论,往往要配置很多环境变量,调用 opengrok.jar 时还要给一堆参数。

我懒,直接来最简单的版本:

  1. 环境变量只配置 OPENGROK_INSTANCE_BASE ,设为 OpenGrok 根目录,其他相关目录,你没有配置会自动在根目录下生成。然后把 OPENGROK_INSTANCE_BASE/bin/ 加入 PATH (为了全局执行 OpenGrok )。
  2. 上述配置生效后(source 或者 重新登录 ssh),将项目源码放到 OPENGROK_INSTANCE_BASE/src/ 下 (我是直接ln 过去,当然你真放也行),然后 sudo -E OpenGrok index

尽可能使用默认配置,除了上面半开玩笑的懒,另一方面原因是怕以后会忘掉自己怎么配置。默认配置有它的道理,刚接触拍脑袋决定很难比默认好,集中放在根目录下也方便管理。以后有新需要,再改不晚。

关闭历史

第一次生成索引,非常顺利。

一段时间之后,代码有更新,重新生成索引,结果一堆报错,几乎每条都是相同内容:

1
2
14:43:02 WARNING: Non-zero exit code status 1 from command [/usr/bin/svn, log, --trust-server-cert, --non-interactive, --xml, -v] in directory /path/to/the/source: svn E170001: Unable to connect to a repository at URL 'svn://path/to/SVN/repo'
svn: E170001: Can't get username or password

原因清楚明白:OG 试图生成文件历史,对每个文件都执行 svn log。可是没有账号密码。

当然没有,我都没给它。

我后来查到,只要定义两个宏的值,就可以告诉它账号密码:

1
2
OPENGROK_SUBVERSION_USERNAME="xxx"
OPENGROK_SUBVERSION_PASSWORD="yyy"

其实你去看 OpenGrok 托管在 github 的 源码 ,看src/org/opensolaris/opengrok/history/SubversionRepository.java ,源码里写得很清楚。

不过因为某些原因,我暂时不想生成历史,怎么关闭历史索引功能呢?我找到了一个讨论:https://github.com/OpenGrok/OpenGrok/issues/32

简单说,只有加了 -S-H 参数,才会生成历史;这点去看 src/org/opensolaris/opengrok/index/Indexer.java 能得到证实。


然而,我并没有加任何参数 ?!

一研究,是这样,参数是传给 oepngrok.jar 的。OpenGrok 脚本默认有添加一系列参数。

那就简单了,直接在 /path/to/OpenGrok/bin/OpenGrok 脚本里搜索,将 -S-H 去掉。很简单,就不贴出来了。


知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议
本文为本人原创,采用知识共享 “署名-非商业性使用-相同方式共享” 4.0 (CC BY-NC-SA 4.0)”许可协议进行许可。
本作品可自由复制、传播及基于本作品进行演绎创作。如有以上需要,请留言告知,在文章开头明显位置加上署名(Jayce Chant)、原链接及许可协议信息,并明确指出修改(如有),不得用于商业用途。谢谢合作。
详情请点击查看协议具体内容。