Такие проекты как AOSP (Android open source project) или LLVM, содержат в себе примерно 2.5 и 11 миллионов строчек кода соответственно. Встроенный в IDE поиск или grep недостаточно эффективны при работе с такими большими кодовыми базами, не говоря уже о поиске в GitLab или GitHub.
Тем кто работают с Linux Kernel хорошо известен сервис bootlin.com. Именно этого – практически мгновенного структурированного поиска по сложной кодовой базе, не хватает многим открытым и «закрытым» – приватным проектам.
Именно для таких случаев многие крупные копании озаботились разработкой собственных инструментов для индексации и поиска, например Code Search от Google.
На мой взгляд лучшим решением из тех, что есть в открытом доступе является OpenGrok от Oracle.
Давайте рассмотрим как можно уменьшить порог вхождения в проекты со сложной кодовой базой, на простом примере. Для этого нам понадобится OpenGrok, Docker и vcstool.
OpenGrok
OpenGrok прекрасно работает в Docker-контейнерах, поэтому нам не придется долго возится с установкой:
docker run --rm -d \
--name opengrok \
-p 8080:8080/tcp \
-e SYNC_PERIOD_MINUTES="10" \
-v ~/opengrok-src/:/opengrok/src/ \
-v ~/opengrok-etc/:/opengrok/etc/ \
-v ~/opengrok-data/:/opengrok/data/ \
opengrok/docker:latest
Через несколько минут после запуска веб-интерфейс OpenGrok станет доступен на 8080 порту:
http://IP_ADDRESS:8080
Перед тем как начать работать с поиском, нужно будет предоставить OpenGrok исходники одного или нескольких проектов.
Vcstool – это «обертка» для нескольких SCM инструментов (git, mercurial, subversion, bazaar), которая облегчает работу с несколькими репозиториями.
Установка vcstool:
yum install python3-pip
sudo pip3 install -U vcstool
Сначала создадим простой манифест со списком необходимых репозиториев:
- git:
local-name: taskflow
uri: https://github.com/taskflow/taskflow.git
version: master
- git:
local-name: renode
uri: https://github.com/renode/renode.git
version: master
- git:
local-name: cartographer
uri: https://github.com/googlecartographer/cartographer.git
version: master
- git:
local-name: pigweed
uri: https://github.com/google/pigweed.git
version: main
- git:
local-name: jetson-inference
uri: https://github.com/dusty-nv/jetson-inference.git
version: master
- git:
local-name: jetson-containers
uri: https://github.com/dusty-nv/jetson-containers.git
version: master
Затем используем vcstool для синхронизации:
vcs-import --input repos.yml ~/opengrok-src/
Через несколько минут после перезапуска контейнера OpenGrok, проекты станут доступными в веб-интерфейсе.
docker stop opengrok && docker rm opengrok
docker run --rm -d \
--name opengrok \
-p 8080:8080/tcp \
-e SYNC_PERIOD_MINUTES="10" \
-v ~/opengrok-src/:/opengrok/src/ \
-v ~/opengrok-etc/:/opengrok/etc/ \
-v ~/opengrok-data/:/opengrok/data/ \
opengrok/docker:latest
![OpenGrok](https://habr.com/images/px.gif#https%3A%2F%2Fi.postimg.cc%2FtCNbS09X%2Ftemp-Imageo-UBH52.avif)