搭建大型源码阅读环境——使用 OpenGrok

RTFSC 是程序员打怪升级路上避不开的功课,那营造一个舒适的环境来提升上课的体验就很有必要了。

比如阅读 AOSP 这种大型源码,用什么姿势来阅读才能丝般顺滑,让 F**king Source Code 也变得不那么可恶呢?

工具的选择

阅读源码的工具我尝试过以下几类:

  1. IDE

    在看特定类型项目时这是我的首选。比如它原本就是一个 Visual Studio 工程,那当然用 Visual Studio 来打开阅读,看 Android App 或者 Library 源码当然用 Android Studio 体验更好。

  2. 编辑器配合插件

    比如 Vim + Ctags + Cscope,再配合文件模糊查找插件 LeaderF 和神器 YouCompleteMe,在源码规模不大时很方便,打开也轻快,阅读一些小项目时我还是乐意使用它们。

  3. 专门的源码阅读工具

    在针对特大型源码时,比如 AOSP 和 Chromium,使用上述两种方案可能会感觉乏力,这时候就需要祭出专门的源码阅读工具了。

    一类是商业软件,比如 Windows 下有著名的 Source Insight,跨平台的有 Understand,功能都很强大,都是不错的选择。当然它们都价格不菲。

    而我这里要讲的主角 OpenGrok 属于另一类,免费,开源,运行流畅,功能也毫不逊色。

如果你还在寻觅适合你自己的解决方案,大可以花一点时间将以上几种都尝试一遍,哪个称手用哪个,也可以像我一样,针对不同的项目使用不同的工具。想直观了解 OpenGrok 的同学可以直接先看看一些使用 OpenGrok 的在线源码查看网站,看看它能否满足你的需求,其中的一些列在 OpenGrok installations。

OpenGrok 特性

译自官方 Wiki。

OpenGrok 提供如下特性:

  1. 快速搜索代码的引擎

    • 搜索全文、定义、符号、文件路径和修改历史

    • 搜索任意指定子目录(分层搜索)

    • 增量更新索引文件

    • 支持类似 Google 的查询语法,比如 path:Makefile defs:target

    • 搜索日期范围内修改的文件

    • 支持使用通配符搜索,如 * 表示多个字符,? 表示单个字符

    • 在搜索结果中展示匹配行

  2. 一个 Web 只读版的版本历史查看界面

    • 文件的修改日志

    • 文件在两个版本间的 diff

    • 文件夹的历史记录

  3. 带语法高亮的交叉引用显示,可以使用 CSS 自定义样式

  4. 可以开发插件支持新的语言和版本控制系统

    已经支持的语言: Supported Languages and Formats

    已经支持的版本控制系统:Supported Revision Control Systems

配置 OpenGrok

截屏

按惯例先上图吧,万一你一眼就发现不是你的菜呢(截图来自官网)。

搜索功能和源码树:

OpenGrok Search and Browse

代码导航和版本历史记录:

OpenGrok Navitation and History

安装和配置

如下以 Windows 下为例,Mac OS X 与 Linux 下与此类似,很多步骤能使用 brew 或者 apt-get 会更方便。

  1. 安装 JDK。

  2. 下载 Tomcat,解压到一个目录,如 D:\Programs\apache-tomcat-8.5.8。

  3. 下载 Universal Ctags for Windows,将 ctags.exe 文件所在目录添加到 PATH 环境变量。

  4. 下载 OpenGrok 的最新包,比如 opengrok-0.13-rc4.zip,解压到一个目录,如 D:\Programs\opengrok-0.13-rc4。

  5. 配置 data root。

    data root 用于放置生成的索引文件和配置信息,比如我在 OpenGrok 目录下创建了一个 data 目录用作 data root,即 D:\Programs\opengrok-0.13-rc4\data。

  6. 将 OpenGrok 的 lib 目录里的 source.war 解压到 D:\Programs\apache-tomcat-8.5.8\webapps\source,配置 WEB-INF\web.xml 文件的 CONFIGURATION 为上一步生成的 data 目录下的 configureation.xml,比如我的配置:

    <display-name>OpenGrok</display-name><description>A wicked fast source browser