Read the Docs 可重复构建(Reproducible Builds)实战指南:用 .readthedocs.yaml 与依赖固定让文档多年稳定可构建

发布时间:2026/9/26 2:54:38

Read the Docs 可重复构建(Reproducible Builds)实战指南:用 .readthedocs.yaml 与依赖固定让文档多年稳定可构建 后端文档【免费下载链接】readthedocs.orgThe source code that powers readthedocs.org项目地址https://gitcode.com/gh_mirrors/re/readthedocs.org点击查看免费下载本指南面向在 Read the Docsreadthedocs.org上托管文档的开发者围绕 docs/user/guides/reproducible-builds.rst 展开文档的构建依赖众多若构建不可重复依赖的一次意外升级就可能在最不合适的时刻弄坏构建或让线上文档与你本地版本不一致。读完本文你将掌握三件事在.readthedocs.yaml中显式固定操作系统与工具链版本、用 requirements 文件固定顶层 Python 依赖、以及用 pip-tools 固定全部传递依赖从而让文档构建在多年跨度内保持稳定、可复现把精力放回内容本身。说明本文涉及的版本号仅为示意既不是最新版本也不是推荐版本具体选择哪个版本取决于你的项目实际情况需要你自行确认与验证。什么是可重复构建为什么重要按 docs/user/glossary.rst 中的术语定义reproducible可重复一个文档项目在 Read the Docs 上能够在多年时间内始终正确构建就被称为可重复的。也可以把它理解为健壮robust或有韧性resilient。pinning固定/钉住版本显式指定依赖应使用的版本。文档在构建时软件依赖会按固定规则所允许的最新版本安装由于软件包发布频繁我们通常要避免某个新版本的兼容性问题突然弄坏文档构建。精确固定exact pinning即sphinx5.3.0这种写法是 Read the Docs 推荐的做法。三种固定粒度对比摘自 glossary写法含义实际安装结果sphinx5.3.0精确固定只允许 Sphinx 5.3.0sphinx5.3,5.4宽松固定允许安装最新的 5.3.xsphinx5,6极宽松固定允许安装最新的 5.x宽松与极宽松固定仍然会让依赖在构建时浮动到最新小版本无法保证与本地构建完全一致因此建议精确固定。一个不可重复的文档项目其构建会因为外部因素依赖发版、镜像更新等而随时中断需要频繁排查和手工修复——这正是本指南要帮你规避的。第一步在 .readthedocs.yaml 中显式固定 OS 与工具链版本Read the Docs 推荐使用仓库根目录的.readthedocs.yaml配置文件显式声明构建所用的操作系统与工具版本。这个文件按版本per version提供设置且这些设置随你的 Git 仓库一起保存因此可以用 Pull Request 预览构建 来验证配置改动确保所有版本都能从一个可重复的配置重建。一个完整的最小示例# .readthedocs.yaml version: 2 # 显式指定操作系统与 Python 版本 build: os: ubuntu-24.04 tools: nodejs: 20 python: 3.12build.os构建用操作系统build.os对应 Read the Docs 构建文档所用的 Docker 镜像镜像名即构建服务器的操作系统。当前仓库中可用的 OS 选项定义在 readthedocs/builds/constants_docker.py 的RTD_DOCKER_BUILD_SETTINGS[os]中ubuntu-22.04ubuntu-24.04ubuntu-26.04ubuntu-lts-latest指向 Read the Docs 当前最新的 Ubuntu LTS 镜像的别名配置参考 docs/user/config-file/v2.rst 中build.os一节明确指出不支持任意 Docker 镜像ubuntu-lts-latest是Read the Docs 上可用的最新 Ubuntu LTS不一定与 Ubuntu 官方最新 LTS 一致而且使用latest别名可能在你项目不兼容新版本时意外弄坏构建。所以追求可重复构建时应像示例一样使用具体的镜像名如ubuntu-24.04而不是浮动别名。build.tools构建工具链版本build.tools是一个字典用于为 python、nodejs、ruby、rust、golang 指定版本且必须至少包含一个工具。每种工具在配置文件中写的短版本号会由 Read the Docs 映射为镜像中通过 asdf 安装的完整版本映射表同样位于 readthedocs/builds/constants_docker.py例如python:3.12→3.12.13、3.13→3.13.14也支持miniconda3-3.12-24.9、mambaforge-23.11、miniforge3-26.3等 Conda/Mamba 解释器版本nodejs:20→20.20.2、22→22.23.1ruby:3.4→3.4.9rust:1.82→1.82.0golang:1.23→1.23.12。每种工具还提供latest别名以及python: 3表示最新 3.x。与ubuntu-lts-latest同理latest是Read the Docs 上可用的最新版本会在至少每六个月一次的更新中前移使用它同样可能意外弄坏构建。可重复构建的要点就是避开这些浮动别名写死具体版本号。底层是如何校验的config 模块源码视角从源码看这份 YAML 会经过以下链路readthedocs/config/parser.py 使用yaml.safe_load解析文件非 YAML 语法、非 mapping 或空配置都会抛出ParseErrorreadthedocs/config/config.py 的load()在仓库中查找.readthedocs.yaml或你显式指定的自定义配置路径校验version必须为2然后实例化并validate()BuildConfigV2.validate_build_config_with_os()readthedocs/config/config.py会校验build.os必须是RTD_DOCKER_BUILD_SETTINGS[os]的键之一、build.tools的每个工具与版本必须在RTD_DOCKER_BUILD_SETTINGS[tools]中合法并且build.tools与build.commands至少提供其一最终通过 readthedocs/config/models.py 的BuildWithOspydantic 模型承载其中BuildTool同时保存短版本号与映射后的完整版本号readthedocs/config/models.py。对应的测试见 readthedocs/config/tests/test_config.py例如test_load_version2验证带build.osbuild.tools的 v2 配置可被正确加载为BuildConfigV2readthedocs/builds/tests/test_buildconfig.py 还验证了不同配置如ubuntu-22.04python3.11与ubuntu-24.04python3.10会分别生成独立的BuildConfig记录——这正是配置随仓库保存、每个版本一套可重建配置的实现基础。第二步用 requirements 文件固定 Python 依赖固定了操作系统和工具链之后下一步是固定 Python 依赖本身。Read the Docs 推荐使用 Pip 的requirements 文件参考 docs/user/config-file/v2.rst 中python.install的 requirements 一节或 Conda 的environment 文件conda.environment来固定 Python 依赖确保顶层依赖与扩展不会悄悄变化。在.readthedocs.yaml中指定依赖文件的配置# .readthedocs.yaml # 显式指定 Python 版本及其 requirements 文件 python: install: - requirements: docs/requirements.txt对应的docs/requirements.txt# 定义精确版本确保构建不被依赖更新破坏 sphinx5.3.0 sphinx_rtd_theme1.1.1 sphinx-notfound-page1.0.2这里python.install是一个列表支持多个条目requirements键的值是相对于仓库根目录的路径。除 requirements 文件外python.install还支持method: pip/method: setuptools已弃用/method: uv配合path安装本地包以及extra_requirements安装可选的 extra例如pip install .[docs]见 docs/user/config-file/v2.rst。提示每隔一段时间记得更新文档依赖以获取新的改进与修复当某个版本到达其生命周期终点end of support时也方便统一管理升级。构建时到底怎么安装python_environments 源码视角配置解析完成后构建阶段由 readthedocs/doc_builder/python_environments.py 的install_requirements()驱动它会遍历config.python.install列表对 requirements 文件类型调用install_requirements_file()对包路径类型调用install_package()对 uv 类型调用install_uv()。其中install_requirements_file()readthedocs/doc_builder/python_environments.py实际执行的命令等价于python -m pip install --exists-actionw --no-cache-dir -r docs/requirements.txt注意--exists-actionw表示覆盖已存在的文件--no-cache-dir禁用 pip 缓存。由于 requirements 文件中的精确固定pip 只会安装你写死的版本传递依赖则受上游包的约束浮动——这正是第三步要解决的问题。第三步用 pip-tools 固定传递依赖transitive dependencies一旦固定了顶层依赖下一个需要担心的是依赖的依赖即传递依赖。如果你不把这些包也固定下来它们可能在毫无征兆的情况下自动升级。Read the Docs 推荐使用pip-tools解决这个问题你在requirements.in中只写顶层依赖pip-tools 的pip-compile命令会为你生成一份包含全部传递依赖且均已固定版本的requirements.txt。docs/requirements.insphinx5.3.0执行pip-compile docs/requirements.in后生成的docs/requirements.txt节选完整文件见原文档 docs/user/guides/reproducible-builds.rst# # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile docs/requirements.in # alabaster0.7.12 # via sphinx babel2.11.0 # via sphinx certifi2022.12.7 # via requests charset-normalizer2.1.1 # via requests docutils0.19 # via sphinx idna3.4 # via requests imagesize1.4.1 # via sphinx jinja23.1.2 # via sphinx markupsafe2.1.1 # via jinja2 packaging22.0 # via sphinx pygments2.13.0 # via sphinx pytz2022.7 # via babel requests2.28.1 # via sphinx snowballstemmer2.2.0 # via sphinx sphinx5.3.0 # via -r docs.in sphinxcontrib-applehelp1.0.2 # via sphinx sphinxcontrib-devhelp1.0.2 # via sphinx sphinxcontrib-htmlhelp2.0.0 # via sphinx sphinxcontrib-jsmath1.0.1 # via sphinx sphinxcontrib-qthelp1.0.3 # via sphinx sphinxcontrib-serializinghtml1.1.5 # via sphinx urllib31.26.13 # via requests这份由 pip-compile 自动生成的文件有两大优点每个包都被精确固定连# via sphinx这样的来源注释都保留了方便日后排查这个包是从哪来的顶层依赖与传递依赖分离管理日常只维护requirements.in需要升级时重新运行pip-compile即可生成的新文件同样可重复、可审查。生成后把docs/requirements.txt交给 Read the Docs 安装即可即第二步中的python.install[].requirements。类似地仓库自身的部署依赖也用同一思路管理根目录的 requirements/pip.in 与 requirements/pip.txt 就是 pip-tools 工作流pip-compile 编译后的固定文件在 readthedocs.org 项目自身中的实际应用。补充Conda 环境的可重复构建如果你使用 Conda/Mamba 管理构建环境应使用conda.environment指向一个 environment 文件来固定依赖。配置示例docs/user/config-file/v2.rstversion: 2 build: os: ubuntu-24.04 tools: python: mambaforge-22.9 conda: environment: environment.yml注意使用 Conda 时必须通过build.tools.python指定使用 Conda 还是 Mamba 来创建环境如miniconda3-...或mambaforge-...。从源码看readthedocs/config/config.py 的validate_conda()会强制要求conda.environment路径存在且相对于项目根目录合法而python_interpreter属性readthedocs/config/config.py正是根据build.tools.python的版本前缀mamba/miniconda/miniforge判定解释器类型的。若声明了 Conda 工具却未提供conda.environment校验会直接报CONDA_KEY_REQUIRED错误。常见误区与注意事项不要用latest或浮动别名ubuntu-lts-latest、python: latest、python: 3、nodejs: latest等别名会随 Read the Docs 每半年左右的镜像更新而前移违背可重复构建的初衷build.os也不支持任意 Docker 镜像。版本号要真实存在配置文件中的工具短版本必须命中 readthedocs/builds/constants_docker.py 的映射表否则validate_choice校验会报错选择版本时请以该表或 docs/user/config-file/v2.rst 的选项列表为准。系统级包优先用 pip/conda构建服务器运行 Ubuntu LTS 并带默认软件源虽可用build.apt_packages安装 APT 包见 docs/user/config-file/v2.rst但应尽量避免用 apt 安装 Python 包如python3-numpy改用 pip 或 conda 固定版本否则同样会引入版本漂移。用 Pull Request 验证配置改动.readthedocs.yaml保存在仓库中配合 Pull Request 预览构建可以在合并前验证新配置、新依赖不会破坏构建。requirements 文件是顶层依赖清单如果团队习惯手写requirements.txt且只含顶层依赖请务必引入 pip-tools或等效的pip freeze工作流把传递依赖一并钉死否则依赖的依赖仍会浮动。相关阅读配置文件完整参考build、python、conda、formats等全部键的完整说明与类型/默认值/选项列表构建过程Read the Docs 的标准构建流程构建过程定制通过build.jobs、build.commands扩展或完全自定义构建步骤术语表pinning、reproducible等核心术语的精确定义Conda 使用指南Conda 环境的完整用法环境变量参考构建时可用的环境变量如$READTHEDOCS_OUTPUT赞分享后端文档【免费下载链接】readthedocs.orgThe source code that powers readthedocs.org项目地址https://gitcode.com/gh_mirrors/re/readthedocs.org点击查看免费下载相关推荐GoReleaser 可重现构建Reproducible Builds完整实战指南GoReleaser 可重现构建Reproducible Builds完整实战指南 GoReleaser 内置了对可重现构建的原生支持通过固定编译时间戳、开发工具CI/CD构建工具Dora Hub 可复现构建Reproducible Builds实战指南从 lockfile 锁定到离线镜像Dora Hub 可复现构建Reproducible Builds实战指南从 lockfile 锁定到离线镜像 DORADataflow Oriente机器人人工智能ROS消息路由如何快速获取yuzu模拟器最新版本完整下载与配置指南如何快速获取yuzu模拟器最新版本完整下载与配置指南 还在为寻找yuzu模拟器稳定版本而烦恼吗想要在PC上流畅运行Switch游戏却不知从何入手yuzu游戏开发上一篇Minecraft服务器性能优化终极指南用Spark快速解决卡顿问题下一篇YOLOv8目标检测实战基于Bingsu/adetailer的深度优化与生产部署架构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/26 2:54:38

北京口碑好的凝胶成像定制设备供应商与制造厂家用户力荐

做凝胶成像设备必踩的4个坑,你中招了吗?在生命科学科研领域,凝胶成像、化学发光成像设备是分子生物学、免疫学实验的核心工具之一。不少实验室在选购这类设备时,常会陷入各种选择困境: 预算有限却想买靠谱设备,却发现…

2026/9/26 2:54:38

MiniMax-H3 全家桶 ComfyUI 部署指南:文件结构、避坑与加速

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 2:54:38

商用Java软件授权怎么做?TrueLicense签名机制与Spring Boot落地

商用软件如果不做授权机制,装包一散出去,基本等于开了一个不限速的下载站。很多Java团队做完产品、进入交付阶段时都会碰到同一个问题:客户怎么在约定时间内使用、只能在指定机器上运行、到期之后自动停用——这些需求不是一句"你手动验…

2026/9/26 4:09:41

python中int的用法是什么

[][]本教程的操作是这样的, 你的电脑系统是用的是点九版的, 电脑牌子是Dell的, 型号为G3, 可是这个办法对所有品牌的电脑都是适用的。关于int, 它是怎么被使用的情况。描述int() 这个函数,它的功能是专门拿来用, 把一个字符串或者是数字, 统统转换去那个整型的类型。…

2026/9/26 4:09:41

MCP Server 开发全流程指南:从架构到部署

这份关于 MCP 开发全流程的指南, 将从架构设计一直到最终的部署工作, 一步步为你展开详细的介绍, 首先我们要对 MCP 的核心概念进行深入且清晰的解析。MCP, 也就是Multi-, 作为一种在分布式系统里面所使用到的那种核心的通信协议机制, 它主要的用途是拿来去实现多个节点彼此之间…

2026/9/26 4:09:41

好消息!Delphi 的VCL FMX 图形用户界面库在python中免费使用

#春日领好运#也许你正处于学习的那个阶段, 而且绝大多数时间都在忙着做一些计算啊或者画个图之类的活儿。这种情况下, print这个函数被用到的机会特别多, 还有一些其他的库也经常被调用来派上用场。可是如果你心里头突然冒出一个想法, 想要去弄一个好看点的图形界面出来面对用户…

2026/9/26 4:09:41

三步搭建MCP Agent,腾讯云大模型知识引擎上线MCP插件

在4月14日这一天, 腾讯云对外宣布了大模型知识引擎进行了升级, 这次升级使得它支持接入MCP协议, 这意味着用户在构建应用的过程中, 不仅可以调用平台方精心挑选的MCP插件, 还可以将自己定制的MCP插件插入进来, 供大模型知识引擎直接调用。当前, 知识引擎平台已经筛选出了好几种…

2026/9/26 4:09:41

python threading和multiprocessing模块基本用法实例分析

现在本文给大家详细讲讲这个情况, 就是关于那个模块的基本用法怎么操作。下面我会把它分享出来, 大家看一看可以参考一下, 具体的内容如下所示:前言这几天, 为了做一个小项目, 我研究了一下并发编程。所谓并发, 无非就是多线程和多进程。最初找到的模块是那个, 因为我的印象中认…

2026/9/25 21:00:17

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/25 20:59:52

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/26 0:04:28

画质修复APP怎么选?Wink影像修复能力与产品实力解析

现如今手机拍摄场景愈发丰富,演唱会直拍、漫展记录、老视频翻新、日常vlog录制,都会遇到画面模糊、噪点多、曝光失衡等问题,不少用户在挑选工具时比较在意一款画质修复APP能够兼顾修复效果与自然质感。Wink作为美图公司推出的全球化AI影像增强…

2026/9/26 0:04:28

超低能耗建筑K值要求能否满足?浙东铝业建筑型材解析

核心摘要浙东铝业的超低能耗系统门窗产品,资料显示保温性能可达 K≤1.4W/(㎡K),能够对应上海地区超低能耗住宅对门窗保温性能的应用需求。判断建筑是否满足超低能耗要求,不能只看铝型材本身,还需要结合玻璃、隔热条、密封系统、开…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/25 18:41:36

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/25 18:34:56

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑