开发者说明
调试、测试和文档说明
开发 RediSearch
开发 RediSearch 功能涉及设置开发环境(可以基于 Linux 或 macOS)、构建模块、运行测试和基准测试以及调试模块及其测试。
克隆 git 存储库
运行以下命令以克隆 RediSearch 模块及其子模块
git clone --recursive https://github.com/RediSearch/RediSearch.git
在隔离环境中工作
在隔离环境中开发有几个原因,例如保持工作站的整洁,以及针对不同的 Linux 发行版进行开发。隔离环境最通用的选项是虚拟机。使用 Vagrant 设置虚拟机非常容易。Docker 更加灵活,因为它提供了一个几乎即时的解决方案
search=$(docker run -d -it -v $PWD:/build debian:bullseye bash)
docker exec -it $search bash
然后,在容器内,cd /build
,然后像往常一样继续。
在此模式下,所有安装都保留在 Docker 容器的范围内。退出容器后,你可以使用上述 docker exec
重新调用容器,或将容器的状态提交到映像,并在稍后重新调用容器
docker commit $search redisearch1
docker stop $search
search=$(docker run -d -it -v $PWD:/build rediseatch1 bash)
docker exec -it $search bash
你可以用你选择的 OS 替换 debian:bullseye
,而主机 OS 是最佳选择,它允许你在构建后在主机上运行 RediSearch 二进制文件。
安装先决条件
要构建和测试 RediSearch,你需要安装几个软件包,具体取决于底层 OS。支持以下 OS:Ubuntu/Debian、CentOS、Fedora 和 macOS。
首先,进入 RediSearch
目录,然后运行
./sbin/setup
bash -l
请注意,这将在您的系统上使用原生包管理器和 pip
安装各种包。它会自行调用 sudo
,提示您提供权限。
如果您希望避免这种情况,您可以
-
查看
sbin/system-setup.py
并手动安装包。 -
使用
./sbin/system-setup.py --nop
显示安装命令,而不执行它们。 -
使用如上所述的隔离环境。
-
使用 Python 虚拟环境,因为众所周知,在不隔离的情况下使用 Python 安装时很敏感
python3 -m virtualenv venv; . ./venv/bin/activate
安装 Redis
根据经验,您运行的是最新版本的 Redis。
如果您的操作系统有 Redis 6.x 或 7.x 包,您可以使用操作系统包管理器安装它。
否则,您可以调用 ./deps/readies/bin/getredis
。
获取帮助
make help
提供开发功能的快速摘要
make setup # install prerequisited (CAUTION: THIS WILL MODIFY YOUR SYSTEM)
make fetch # download and prepare dependant modules
make build # compile and link
COORD=1|oss|rlec # build coordinator (1|oss: Open Source, rlec: Enterprise)
STATIC=1 # build as static lib
LITE=1 # build RediSearchLight
DEBUG=1 # build for debugging
NO_TESTS=1 # disable unit tests
WHY=1 # explain CMake decisions (in /tmp/cmake-why)
FORCE=1 # Force CMake rerun (default)
CMAKE_ARGS=... # extra arguments to CMake
VG=1 # build for Valgrind
SAN=type # build with LLVM sanitizer (type=address|memory|leak|thread)
SLOW=1 # do not parallelize build (for diagnostics)
GCC=1 # build with GCC (default unless Sanitizer)
CLANG=1 # build with CLang
STATIC_LIBSTDCXX=0 # link libstdc++ dynamically (default: 1)
make parsers # build parsers code
make clean # remove build artifacts
ALL=1 # remove entire artifacts directory
make run # run redis with RediSearch
GDB=1 # invoke using gdb
make test # run all tests
COORD=1|oss|rlec # test coordinator (1|oss: Open Source, rlec: Enterprise)
TEST=name # run specified test
make pytest # run python tests (tests/pytests)
COORD=1|oss|rlec # test coordinator (1|oss: Open Source, rlec: Enterprise)
TEST=name # e.g. TEST=test:testSearch
RLTEST_ARGS=... # pass args to RLTest
REJSON=1|0|get # also load JSON module (default: 1)
REJSON_PATH=path # use JSON module at `path`
EXT=1 # External (existing) environment
GDB=1 # RLTest interactive debugging
VG=1 # use Valgrind
VG_LEAKS=0 # do not search leaks with Valgrind
SAN=type # use LLVM sanitizer (type=address|memory|leak|thread)
ONLY_STABLE=1 # skip unstable tests
make unit-tests # run unit tests (C and C++)
TEST=name # e.g. TEST=FGCTest.testRemoveLastBlock
make c_tests # run C tests (from tests/ctests)
make cpp_tests # run C++ tests (from tests/cpptests)
make vecsim-bench # run VecSim micro-benchmark
make callgrind # produce a call graph
REDIS_ARGS="args"
make pack # create installation packages (default: 'redisearch-oss' package)
COORD=rlec # pack RLEC coordinator ('redisearch' package)
LITE=1 # pack RediSearchLight ('redisearch-light' package)
make upload-artifacts # copy snapshot packages to S3
OSNICK=nick # copy snapshots for specific OSNICK
make upload-release # copy release packages to S3
common options for upload operations:
STAGING=1 # copy to staging lab area (for validation)
FORCE=1 # allow operation outside CI environment
VERBOSE=1 # show more details
NOP=1 # do not copy, just print commands
make docker # build for specified platform
OSNICK=nick # platform to build for (default: host platform)
TEST=1 # run tests after build
PACK=1 # create package
ARTIFACTS=1 # copy artifacts to host
make box # create container with volumen mapping into /search
OSNICK=nick # platform spec
make sanbox # create container with CLang Sanitizer
从源代码构建
make build
将构建 RediSearch。
make build COORD=oss
将构建 OSS RediSearch Coordinator。
make build STATIC=1
将构建为静态库。
说明
- 根据平台和构建变体,二进制文件放置在
bin
下。 - RediSearch 使用 CMake 作为其构建系统。
make build
将调用 CMake 和后续的 make 命令,这是完成构建所必需的。
使用 make clean
删除构建工件。make clean ALL=1
将删除整个 bin
子目录。
诊断构建过程
make build
默认情况下将并行构建。
为了构建诊断的目的,make build SLOW=1 VERBOSE=1
可用于检查编译命令。
使用 RediSearch 运行 Redis
以下将运行 redis
并加载 RediSearch 模块。
make run
您可以在另一个终端中打开 redis-cli
与其交互。
运行测试
有几组单元测试
- C 测试,位于
tests/ctests
中,由make c_tests
运行。 - C++ 测试(由 GTest 启用),位于
tests/cpptests
中,由make cpp_tests
运行。 - Python 测试(由 RLTest 启用),位于
tests/pytests
中,由make pytest
运行。
您可以通过调用 make test
运行所有测试。
可以使用 TEST
参数运行单个测试,例如,make test TEST=regex
。
调试
要为调试构建(启用符号信息并禁用优化),请运行 make DEBUG=1
。然后,可以使用 make run DEBUG=1
来调用 gdb
。除了在 gdb
中设置断点的通常方法外,还可以使用 BB
宏在 RediSearch 代码中设置断点。它仅在 gdb
下运行时才有效。
类似地,在单测试模式下的 Python 测试中,可以使用测试中的 BB()
函数设置断点。