You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake项目中如何仅在nlohmann/json更新时执行测试?

解决nlohmann/json每次编译都跑测试的问题

要搞定这个问题,你只需要调整CMake里ExternalProject的配置,把测试触发逻辑限制在源码更新或首次下载的时候,具体方案如下:

核心配置思路

  1. 先禁用nlohmann/json自带的测试构建,避免每次本地编译都浪费时间编译测试代码
  2. 自定义测试触发规则,让测试只在源码更新完成后执行一次,不会干扰日常编译

具体CMake代码示例

include(ExternalProject)

ExternalProject_Add(
    nlohmann_json
    GIT_REPOSITORY https://github.com/nlohmann/json.git
    GIT_TAG v3.11.2  # 换成你实际用的版本号
    GIT_SHALLOW ON  # 浅克隆加速下载
    CMAKE_ARGS
        -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
        -DBUILD_TESTING=OFF  # 关键:关掉nlohmann/json自带的测试构建
        -DJSON_BuildTests=OFF  # 部分旧版本用这个参数,双保险
    UPDATE_DISCONNECTED OFF  # 允许检测源码更新(比如切换tag)
    # 自定义测试逻辑:只在更新/首次下载后跑测试,且测试通过才安装
    TEST_COMMAND ${CMAKE_CTEST_COMMAND} --test-dir <BINARY_DIR> -C Release
    TEST_BEFORE_INSTALL ON
    TEST_EXCLUDE_FROM_MAIN ON  # 不让测试绑定到主构建目标,避免每次编译都触发
)

# 把你的项目目标和nlohmann_json关联,确保依赖生效
add_dependencies(your_project_target nlohmann_json)

关键参数说明

  • BUILD_TESTING=OFF/JSON_BuildTests=OFF:彻底禁用nlohmann/json的测试代码编译,砍掉不必要的构建环节
  • TEST_EXCLUDE_FROM_MAIN ON:告诉CMake,测试不属于日常构建流程的一部分,不会在你跑make或cmake --build时自动触发
  • TEST_BEFORE_INSTALL ON:保证只有测试通过的版本才会被安装到你的项目里,避免引入有问题的依赖
  • 如果你想手动触发测试,直接跑cmake --build . --target nlohmann_json_test就行;当你切换nlohmann/json的版本tag或者拉取新源码时,测试会自动执行一次

进阶自定义(可选)

如果需要更精细的控制,比如自己判断源码是否更新再跑测试,可以自定义更新命令:

ExternalProject_Add(
    nlohmann_json
    # 保留前面的GIT、CMAKE_ARGS等配置
    UPDATE_COMMAND ""  # 禁用默认更新逻辑
    CUSTOM_COMMAND
        COMMAND git pull origin ${GIT_TAG}
        COMMAND ${CMAKE_CTEST_COMMAND} --test-dir <BINARY_DIR> -C Release
        WORKING_DIRECTORY <SOURCE_DIR>
        COMMENT "更新nlohmann_json并运行验证测试"
)

这种方式适合对更新流程有特殊需求的场景,但日常用前面的基础配置就足够了。

内容的提问来源于stack exchange,提问作者user18190011

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:10:46