日常读一些C++代码的时候,个人习惯使用clangd来辅助阅读代码(比如find all reference,转到定义等),但是因为clangd依赖项目支持生成compile_commands.json,所以不是所有的项目都能用clangd来辅助阅读代码的。比如MongoDB,OceanBase个人尝试过都没啥很好的办法来用clangd
组里的大佬给推荐了一个源码阅读的工具叫opengrok,知乎里也有介绍:https://www.zhihu.com/question/33505693/answer/132224974
这里就给一下配置opengrok的教程
配置opengrok
这里其实跟着github里的README来就可以了,opengrok还给提供了docker,配置起来更加方便
详细的在这里:https://github.com/oracle/opengrok/blob/master/docker/README.md
- 在github上的release中把opengrok下载下来,解压,会得到一个opengrok的目录
- 找个地方创建一个docker-compose.yml。注意这里默认是用的home下的opengrok,可以根据自己的目录调整一下
version: "3"
services:
opengrok:
container_name: opengrok
image: opengrok/docker:latest
ports:
- "8080:8080/tcp"
environment:
SYNC_PERIOD_MINUTES: '60'
# Volumes store your data between container upgrades
volumes:
- '~/opengrok/src/:/opengrok/src/' # source code
- '~/opengrok/etc/:/opengrok/etc/' # folder contains configuration.xml
- '~/opengrok/data/:/opengrok/data/' # index and other things for source code
- 执行
docker-compose up
,官方这里推荐是用docker-compose up -d
来后台执行,我推荐第一次先前台执行看看有没有错误日志什么的
一般来说到这里就完事了,这时可以访问下localhost:8080,看看是不是有opengrok的界面了
配置代码仓库
这里就是把需要读的代码仓库下载到opengrok/src下就行,opengrok会自动帮忙pull一下最新的分支
建议一开始先用一个小项目试一下opengrok,看看是否可以正常work,我这里用的是leveldb,git clone后,可以重启一下docker来主动触发index。一般比较小的项目速度会比较快,所以稍等一会后再去访问localhost:8080,应该可以在project中看到你的项目。选择项目后就可以做一些搜索了
然后可以试一下大型项目,我这里用的是mongodb。需要注意的是,大型项目在默认的opengrok的配置下运行会非常的慢,导致你可能认为是opengrok的问题,实际上是他还在执行index,因为index的时间通常比较久
有关细节的调优可以看这里:
* https://github.com/oracle/opengrok/wiki/Tuning-for-large-code-bases
* https://github.com/oracle/opengrok/wiki/Python-scripts-transition-guide
优化点主要有3个:
* opengrok docker下默认会启动history的index,应该是对历史的commit也做index,这对一个大型项目来说开销就更大了,因为大型项目的history通常比较长。
* index的默认并发度比较低,可以调高点。注意同时观察下docker占用的资源,可以在资源空闲的时候多分配一些。
* opengrok有周期性的reindex,可以关掉来节省资源。比如默认10分钟的reindex,可能上一轮的index还未结束
在docker-compose.yaml的environment
中加上这几行:
environment:
SYNC_PERIOD_MINUTES: '0'
INDEXER_OPT: '--progress --threads 8'
表示不进行reindex,以及index的选项中打开进度,以及设置并发度。
此时再重启docker,就可以正常用了
文章评论