您的位置:首页 > 编程语言

搭建Ubuntu平台上的代码搜索引擎

2015-10-06 21:56 483 查看
由于平时需要阅读Android code, 我发现像androidxref.com这样的网站提供了非常方便的代码搜索功能,在源代码文件之间提供了高效的相互索引。

利用空余时间,我研究了一下如何搭建这样的系统,以便将来自己可以搭建其他代码的搜索引擎。根据网上找到的资料,基本上是有LXR和OpenGrok两种引擎。我按照找到的资料自己动手搭建了一下,遇到了一些问题并逐一解决,在此和大家分享一下,大部分的内容也是借鉴了其他博客的经验。

一. LXR

LXR是"the Linux Cross Reference"的缩写。LXR的opensource project 的位置在 http://sourceforge.net/projects/lxr/

LXR是用perl编写的,提供了以下功能,

1. 支持多种语言,包括 C, C++, Java, Python, Ruby, Perl, COBOL。

2. 迅速查找标识符的定义和使用位置。

3. 快速查找代码。

4. 支持大量代码

5. 支持多版本,并在多个版本之间进行比较。

LXR在Ubuntu环境下,是通过Apache服务器来访问的,其基本步骤是,

1. 通过LXR的配置步骤产生Apache服务器配置文件apache-lxrserver.conf,这个文件指向了LXR工作目录。

2. 通过genxref在LXR工作目录下建立索引数据库,基于mysql。

3. 当使用http://<IP>/source访问时,source是一个perl文件,它会访问索引数据库来建立代码访问页面。(这里我还没有仔细研究source这个perl文件)

安装步骤:

1. 安装apache

sudo apt-get install apache2

sudo apt-get install libapache2-mod-perl2 libapache2-mod-apreq2

如果没有执行第二个安装命令,后面启动Apache是会出现错误,Invalid command 'PerlTaintCheck'

2. 安装perl

sudo apt-get install perl

我的perl版本是v5.18.2

3. 安装mysql

我的系统里面已经安装好mysql,版本是5.5.42-standard

4. 安装ctags

sudo apt-get install ctags

5. 安装File::MMagic

sudo cpan

cpan[1]>install File::MMagic

这是在genxref中要用到的。

6. 安装glimpse

sudo apt-get install flex

wget http://webglimpse.net/trial/glimpse-latest.tar.gz
tar xzf glimpse-latest.tar.gz

cd glimpse-4.18.6/

./configure

make

sudo make install

7. 安装LXR

wget http://skylineservers.dl.sourceforge.net/project/lxr/stable/lxr-2.0.3.tgz
tar xzf lxr-2.0.3.tgz

cd lxr-2.0.3

./genxref –checkonly (检查工具是否安装好)

./scripts/configure-lxr.pl -vv (配置lxr)

重要的配置项:(其他回车即可)

--- Host name or IP? [//localhost] > //<IP address> (如果要通过IP地址而不是localhost来访问的话,在这里填入IP地址)

- Directory for glimpse databases? > /home/<user name>/lxr-2.0.3/glimpse-DB (user name填你的用户名)

- Caption in page header? (e.g. Project XYZZY displayed by LXR) > lxr

- Source directory? (e.g. /home/myself/project-tree) > /home/<user name>/Android

- Version name? > 5.1.1_r1

- Database name? > lxr

- DB user name? [lxr] > root

- DB password? [lxrpw] > 123456

8. 初始化数据库

./custom.d/initdb.sh

输入mysql的root密码123456

9. 修补LXR的一个bug,不然后面genxref会报错。源文件少了一个右括号。

--- lxr/lib/LXR/Lang/Cobol.pm 2013-11-08 17:04:27.000000000 +0800

+++ lxr/lib/LXR/Lang/Cobol.pm 2015-10-06 09:24:02.027642181 +0800

@@ -49,7 +49,7 @@

? join($2, @{$$self{'itag'}})

: $2

- )

+ ))

);

}ge;

10. 配置Apache服务器

cd lxr-2.0.3

sudo
cp custom.d/apache-lxrserver.conf /etc/apache2/sites-available/

sudo
ln -s /etc/apache2/sites-available/apache-lxrserver.conf /etc/apache2/sites-enabled/apache-lxrserver.conf

sudo apachectl restart

12. 把Android代码放在/home/<user name>/Android/5.1.1_r1目录下
(这和上面的版本配置要一致)

13. 生成代码索引,需要较长时间

cd lxr-2.0.3

./genxref –url=http://<IP address>/lxr –version=5.1.1_r1 (这和上面的版本配置要一致)

14. 我们可以通过http://localhost/lxr/source来访问代码索引。如果代码索引没有完成,我们仍然可以看到代码,但无法索引。

如果要重新生成代码索引,我们可以删除数据库,然后重复上面的第13步。

删除数据库:rm -rf lxr-2.0.3/glimpse-DB/*

最后我们看到的界面是这样的,



生成索引的情形



参考网站: http://x-slam.com/kernel_source_code_view_server_bylxr
二. OpenGrok

OpenGrok是用Java编写的另一个代码搜索引擎,Opensource的网站在http://opengrok.github.io/OpenGrok/

Grok在英文里的意思是:心领神会,神交。这代表着OpenGrok能够深入理解各种代码的含义。androidxref.com用的就是OpenGrok引擎。

与LXR不同的是,OpenGrok需要使用Tomcat,作为一个Tomcat的web应用而部署的。OpenGrok需要Java 1.7

OpenGrok将代码索引生成在/var/opengrok/data目录下。OpenGrok作为Tomcat的web应用被启动,然后读取代码索引文件。

安装步骤:

1. 安装Java 1.7

sudo apt-get install oracle-java7-installer

(如果不能安装换成 sudo apt-get install openjdk-7-jdk ant)

2. 安装Tomcat

sudo apt-get install tomcat7

3. 获取OpenGrok包
https://codeload.github.com/OpenGrok/OpenGrok/tar.gz/0.12.1
tar xzf opengrok-0.12.1.tar.gz

4. 编译OpenGrok

cd opengrok-0.12.1

ant

ant package

sudo cp dist/source.war /var/lib/tomcat7/webapps/

5. 建立OpenGrok目录

$sudo mkdir -p /var/opengrok/etc

$sudo mkdir -p /var/opengrok/data

6. 建立索引

sudo ./OpenGrok index <SRC_ROOT> (SRC_ROOT就是代码目录,此目录下的每一个子目录都会成为OpenGrok里面的一个project,在右边的选项里面出现。)

如果遇到这样的问题,是因为没有安装ctags。

Loading the default instance configuration ...

ERROR: Unable to determine Exuberant CTags command name for Linux 3.16.0-53-generic

FATAL ERROR: Missing Dependent Application - Exuberant CTags - Aborting!

运行 sudo apt-get install ctags 安装ctags

最后我们访问http://<IP address>:8080/source会看到这样的界面,



如果要重新生成代码索引,比如增加或者删除项目,需要把数据库删除然后重新生成。(目前我还没有找到更有效的方法)

$sudo rm -rf /var/opengrok

$sudo mkdir /var/opengrok/etc

$sudo mkdir /var/opengrok/data

$cdOpenGrok-0.12.1

$sudo ./OpenGrok index <SRC_ROOT>

$ant

$ant package

$sudo cp dist/source.war /var/lib/tomcat7/webapps/

OpenGrok代码目录下的README.txt里有更多的参考内容,比如如何定制化网站的内容。

参考文档: http://blog.csdn.net/michaelpp/article/details/9258563
三. LXR和OpenGrok的简要对比

LXROpenGrok
编程语言PerlJava
Web服务器ApacheTomcat
分级管理多个版本多个项目(project)
在同样的Ubuntu服务器上,OpenGrok的效率比LXR要高很多。扫描整个Android AOSP代码,LXR需要18个小时以上,而OpenGrok只需要4个小时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: