有哪些不错的大型项目代码浏览工具?

有的时候想系统的浏览一些开源的库或者软件的源代码,比如google guava,却发现没有合适的浏览工具。我目前是用IDE(eclipse和IDEA)…
关注者
2,579
被浏览
563,264

35 个回答

当然有:

OpenGrok

好多公司在用,

早年一直在用 Source Insight,是比较好用,但是这商业产品十多年时间既不开源也不增加大的新功能,几大硬伤更是让我不得不抛弃它:

不跨平台:在我离开 Windows办公的时候,一路没有找到的代码浏览工具,只有在 Wine下运行 Source Insight,结果这家伙在 Wine下时不时给我来个崩溃。

支持语言少:少的可怜了,C++, Java, C#, 而已,且都是比较早的语言标准了,扩充点新语言扩充的相当别扭和残缺。

单线索浏览:这个比较恶心,只有一个主窗口,没有TAB同时打开多个源文件的功能,我追着一条线索看过去,想同时看第二条线索基本上没办法,只能第一条看完后,回退,回退,再回退,回到刚才的位置,然后再继续跟第二条线索。当前惟一的一个代码窗口,在我全局搜索一个东西时,就会被覆盖成搜索结果,搜索结果点到其中一项又会覆盖成对应的源代码,想要看回刚才的搜索结果就只有回退,回退,无法同时打开多处,对照查看。

多定义不友好:多处定义(比如代码里其实是多处宏条件,定义同一个接口的不同实现,或者多层定义)的时候预览窗口傻的要死。

自动预览问题:自动预览好用是好用,但有些时候连着跳几层,把我最想看的一层给跳过去了,这就比较坑爹,还不如我手动预览。

这些问题在我刚开始的时候都没什么感觉,我试了好多代码浏览软件最终选择了 OpenGrok的时候,一对比,Source Insight 基本就是渣,人家 OpenGrok还开源。

截图1:搜索界面和源代码树

截图2:具体代码

我比较喜欢 OpenGrok的地方有几个:

使用方便:架设是比较麻烦,特别你想改一下它的很多默认代码目录位置,但一旦架设好,基本就很简单了,在 SRC_ROOT下面 check out 你想要阅读的代码,然后 OpenGrok index 一下即可,增量更新索引。

基于 WEB:在服务端运行,基于 Web这样我多个设备都可以同时浏览,以前台式机和笔记本都要安装 Source Insight才行,现在跑在我自己的 nas上面(vps上面也有一份),你只要打开浏览器就行。

支持语言多:使用 Universal CTags 作为后端 parser引擎,支持进百种语言,你想得到的语言都有。

功能强大:web上浏览源代码时,具体点击函数名就跳转到定义处,可以方便的按不同项目搜索:定义,引用,文件名。右边有文档结构图,配合 web浏览器,还可以添加一些记录笔记和剪切分享的功能。

多线索浏览:这是我最喜欢的功能,选择一处定义,在浏览器上“在新标签中打开” 即可,原来的位置继续保留,随时对照查看,不会象 Source Insight一样只能同时打开一个文件,因为浏览器的多标签,你想打开多少个文件都可以,想搜索多少次都行,并且保留结果,看到比较会心的地方,使用 Chrome的 Evernote插件,剪切当前代码到你笔记里面,或者发送到你的 gist.github.com

支持 iPad:因为是网页版的,你趟床上拿着 iPad看都没问题,看到重要的地方,增加一个书签,第二天在你的 mac上书签就同步过来了。没有mac的话,可以iPad在 Safari里面剪切到 Evernote,第二天 PC上接着整理。

如今我基本把 Source Insight之类的只能在本地看代码的东西都卸载了,公司里面架设一套,家里架设一套 OpenGrok,把和项目的相关代码全部扔上去,一次创建索引,所有人都可以方便查看。

对比 Vim/Emacs + Ctags

我小项目也会用Vim+ctags/cscope 浏览代码,但 ctags只能看定义不能看引用,cscope可以看引用赋值,但只支持c语言(C++支持的都比较残缺)。虽然 OpenGrok 使用 ctags 做parser,但是仅仅做parser而已,扫描出来的东西会被分成定义,引用,赋值等数据放到 OpenGrok自己的数据库里面,下次修改了文件做增量更细会很快,不会有一大堆的tags文件,搜索又慢,又没有符号引用信息。

再者浏览大项目,特别是动脑的项目,我不喜欢两只手都放键盘上,读代码还是右手控制鼠标就行了,左手有时得喝点饮料抽根烟什么的,或者干脆趟沙发上,用 iPad阅读,思考嘛,首先要足够放松。

对比 Android Studio , VS

没错大型 IDE也能浏览代码,也能搜索符号定义,虽然也可以多线索浏览,但很多时候还没有source insight方便,而 source insight上面已经被我们秒了。大型 ide和 source insight 一样支持语言较少,要安装一堆东西不说,还得把你co下来的项目弄个工程文件,或者导入到当前 workspace,没有 OpenGrok那么方便专注,当你有可能阅读的代码涉及的语言比较多的时候,co下来增量index一下即可,不用任何多余的事情,更重要的是 IDE不能在 iPad 上看代码。

加个比较图表:

安装注意:

1. 默认的数据文件(索引和交叉引用等)在 /var/opengrok 下面,注意 /var 分区的磁盘大小,很多 ubuntu, debian的默认分区,/var空间很小,可以挪到 /home/data/opengrok 下面,保证足够空间,否则索引生成失败。

2. 源文件夹内的文件对 tomcat8 用户(debian下面 apt-get tomcat8后,使用 tomcat8这个用户来跑tomcat)对源文件有可读权限,很多以前的 windows下压缩出来的 rar文件解开后只有自己有读取权限,导致 tomcat8 用户无法访问时,opengrok会报一个:“File Not Find"

3. 可以用 java7 + tomcat8跑 stable版本 0.12.1.6,而 0.13的 RC版本却需要java8,安装请注意。

----

再放一张具体使用截图,可以配合 Chrome的各种插件在代码页面上标注重点,添加注释:

搜索页面,在 linux-2.6.11.12项目中,对 kmem_cache_alloc搜索引用,除此之外还可以全局搜索,正则搜索,按类型搜索,搜索历史(项目目录需要是svn或者git本地仓库)。

--

最后,回答题主问题:

1. 方便的文件搜索与类搜索。输入文件名或类名,能够直接找到相应的文件。----- (支持)

2. 方法跳转。在方法调用处,可以直接跳转到方法定义处。除了方法还应该支持类枚举等。(支持)

3. 支持java:支持

4. 支持mac:支持

首先,有一篇有意思的Google的论文总结了程序员搜索代码的行为模式,可以看看[1]。Google内部的code search据说十分好用,应该可以满足你的需求,但前提是你得在那上班。

下面讲2个我知道的免费的。

Grepcode

grepcode.com/

基本满足问题的需求,一旦我们进入了一个文件,可以比较方便地找到定义。而且页面跳转的速度不错,就像是在看静态网页。我比较抱怨的就是搜索功能,不懂应该怎么用。比如搜

string - GrepCode.com

, 看不懂是什么意思。我很少直接用它的搜索,一般放Google搜grepcode的网页,如果像是我要找的代码再点进去。

Codatlas

Codatlas | Best Place to Browse Code on the Web

现在看到浏览代码体验最接近IDE的网站。交叉索引的覆盖率堪比IDE[其实这些交叉索引直接就是用编译器生成的]。首页搜索框的自动补全很好用,大多数时候都不需要搜索,而且提示是基于函数名,类名,以及项目名的。有一个很好用的功能是找到一个函数所有被调用的地方,grepcode只能找到同一个项目内的引用,codatlas能够找到所有它索引的project中的引用。比如看isEmpty这个函数,grepcode只能找到几条结果[

GC: java.util.List.isEmpty()

], codatlas返回的结果就有意思多了[

jdk7u-jdk | Codatlas

, 点一下isEmpty就能看到所有引用]。它还支持用户提交repo[

Codatlas | Best Place to Browse Code on the Web

]给它索引。我最近交了很多java的repo,如果你想看的repo没有在上面,也可以提交。scala和c++的支持也不错,可以尝试一下。





[1]

static.googleusercontent.com