开发者说明

调试、测试和文档说明

开发 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() 函数设置断点。

对本页进行评分