首页
/ Tesseract 贡献指南:Issue 报告规范与开发者构建、测试、Pull Request 工作流详解

Tesseract 贡献指南:Issue 报告规范与开发者构建、测试、Pull Request 工作流详解

2026-09-03 15:38:13作者:曹令琨Iris

本文基于 Tesseract 主仓库的 CONTRIBUTING.md 编写,完整覆盖其两大核心主题:普通用户/使用者在报告 Bug、提问求助时应遵循的 Issue 与论坛分流规则和附件规范,以及开发者在提交 Pull Request 前必须完成的构建、单元测试与质量扫描流程。读完后,你将知道 Tesseract 中哪些情况该建 Issue、哪些情况该去用户论坛,并能在本地完整走通 git submoduleconfiguremakemake checkmake training 的验证链路,使你的 PR 具备被合并的前提条件。

一、问题反馈入口:Issue 还是用户论坛?

Tesseract 将"报告 Bug"与"使用求助"明确分流:只有确认是引擎本身的缺陷时才创建 Issue;而以下几类情况应改用用户论坛提问,不要占用 Issue 区:

  • 使用 Tesseract 遇到问题、需要操作帮助;
  • 软件安装过程中遇到问题;
  • 对 OCR 识别精度不满意,希望获得改进建议(文档要求先阅读其 ImproveQuality 相关文档);
  • 正在训练 Tesseract,遇到训练流程问题或想咨询训练过程(文档要求先阅读官方训练指南);
  • 一般性、非缺陷类问题。

平台范围:只有主流平台才接受 Issue

原文档规定,只有当你的运行平台属于下列范围时,Issue 才会被受理;更旧版本或其他操作系统一律改用论坛:

平台 受理范围
Linux 不支持比当前时间早 4 年以上的发行版本
Windows Windows 7 或更新版本
macOS 最近 3 个发布版本

Issue 报告的硬性要求

CONTRIBUTING.md 对 Issue 内容做了一系列可操作的规定,逐条整理如下:

  1. 必须写明操作系统及具体版本号,例如 "Ubuntu 16.04"、"Windows 10"、"Mac OS X 10.11";

  2. 先搜索已打开和已关闭的 Issue,确认类似问题是否已被报告(有时甚至已解决);在论坛提问前也应同样先搜索历史帖子;

  3. 在报告 Issue 或论坛提问前先阅读官方文档,避免重复提问;

  4. 只针对最新官方发布版本报告问题;可选地在 git 仓库的最新快照(snapshot)中验证问题是否已被修复;

  5. 必须能用 Tesseract 命令行程序复现问题。如果问题出现在调用 Tesseract 的外部程序(包括各类封装库和开发者自己的程序)中,应优先向该外部软件的开发者报告;

  6. 确认语言数据安装正确。每个 Tesseract 版本有各自独立的语言数据,必须安装并安装英文(eng)和 osd 两份训练数据,并用下面的命令验证引擎确实认识这些数据(包括你安装的其他语言包):

    tesseract --list-langs
    

    该命令的实现位于命令行入口 src/tesseract.cpp:解析到 --list-langs 参数时置位 noocrlist_langs,即跳过 OCR 流程、只输出可用语言列表,帮助维护者排除"语言包缺失"这类环境问题造成的误报。

  7. 附上可演示问题的示例文件,但不得包含涉及自己或他人的隐私内容;

  8. 附件格式限制

    • 单个文件不得超过 20 MB;
    • 平台仅支持少量文件扩展名(如 .png.txt),被拒收的文件可先压缩为 zip 再上传;
    • 不要在 Issue/帖子中附带程序或库本身,大文件或程序应提供可下载的链接;
    • 只有在问题与多页功能相关时才附多页 TIFF 图像,否则只附一张或少数几张单页图像;
  9. 报错信息请复制控制台文本,不要发截图

  10. 排版规范:使用编辑区工具栏格式化内容;代码样本或命令输出前后各加三个反引号(也可用 Insert code 按钮);超过约 25 行的代码/输出请另存为 filename.txt 作为附件上传;提交前先点 Preview 预览并通读一遍。

文档还特别提示:回复 Issue 和回答论坛问题的大多是普通用户和志愿者开发者,请保持礼貌;并且并非每个 Issue/问题都会得到回复——原因可能是时间有限、当前在线的人也不知道答案,或该问题早已被反复回答过,请勿因此个人化地不满。

开发向的讨论(Bug 修复、功能增强、Tesseract 附加组件)则属于开发者论坛的范畴,而非用户论坛。

二、开发者提交 Pull Request 的完整前置流程

CONTRIBUTING.md 的 "For Developers" 部分给出了 PR 前的强制验证流程。核心原则只有一句:在发布改动之前,必须确保你的改动能够成功构建并运行、测试通过。以下按仓库实际结构展开。

1. 必须包含两个 git 子模块

你的代码克隆必须包含全部子模块,否则单元测试无法构建。仓库根目录的 .gitmodules 定义了仅有的两个子模块:

[submodule "googletest"]
	path = unittest/third_party/googletest
	url = https://github.com/google/googletest.git
[submodule "test"]
	path = test
	url = https://github.com/tesseract-ocr/test.git

文档给出的两种获取方式:

  • 初始克隆时指定 --recurse-submodules
  • 或者事后对每个子模块执行 git submodule update --init --recursive NAMENAMEgoogletesttest)。

文档还给出了一个典型的排错提示:如果 configure 已经创建了这两个目录(导致 git submodule update 被"目录已存在"阻塞),需要先删除这些目录(或执行 make distclean),再重新初始化子模块并重新 configure。

2. 三条 make 目标:构建、测试、训练工具

文档摘要给出的最小验证循环是:从选定的构建目录运行 configure 之后——

  • make:构建核心库 libtesseract 与命令行工具 tesseract
  • make check:构建并运行单元测试套件;
  • make training:构建训练工具集(lstmtrainingmftrainingcombine_tessdata 等,源码位于 src/training)。

这三条目标在 Makefile.am 中都有对应实现,可以据此确认行为边界:

  • training 目标定义于 Makefile.am#L744training: $(trainingtools) | $(PROGRAMS),且仅在 ENABLE_TRAINING 配置项开启时存在;若未启用,make training 只会提示 "Need to reconfigure project"(见 Makefile.am#L761-L762),这也是文档要求"先让构建和测试通过再谈发布"的底层原因——训练工具依赖主库与 $(PROGRAMS) 先就绪。
  • 单元测试对训练代码有依赖,Makefile.am#L754-L757 显式声明了 check: libtesseract_training.la 以及 check: dawg2wordlist wordlist2dawg(因为 dawg_test 会实际调用这两个训练工具),说明 make check 的构建范围比源码树中的 C++ 单元测试更宽。
  • check_PROGRAMSMakefile.am#L1168-L1257 中逐一列出了 60 余个 gtest 用例,涵盖 baseapi_testlstm_testdawg_testunicharset_testtablefind_testparagraphs_testintfeaturemap_test 等,最终通过 Makefile.am#L1262TESTS = $(check_PROGRAMS) 交给 automake 的 make check 框架执行。

构建脚本本身由 GNU autotools 生成。仓库根目录的 autogen.sh 负责依次调用 aclocallibtoolizeautoconfautoheaderautomake 重新生成 configure 与各 Makefile.in,并在结尾提示用 ./configure [--enable-debug] 完成配置;其注释也说明了"真实源文件"是 configure.acMakefile.am 等,其余均为自动生成物。修改构建配置时,这一背景决定了你应当在配置文件中改动、而非手改生成产物。

3. 单元测试的数据与字体依赖

make check 能否跑起来,还取决于测试数据布局。unittest/README.md 描述了期望的目录结构:仓库根下(或构建侧)需要 langdata_lstmtessdatatessdata_besttessdata_fast 四个数据目录(分别提供 osd/eng 等训练语言文件、普通精度、最佳精度与快速精度三档 traineddata),以及一组用于图像合成的字体文件(Arial、DejaVu、Lohit-Hindi 等)。其给出的运行序列为:

autoreconf -fiv
git submodule update --init
git clone <tessdata_unittest 仓库> tessdata_unittest --depth 1
cp tessdata_unittest/fonts/* test/testing/
mv tessdata_unittest/* ../
export TESSDATA_PREFIX=/prefix/to/path/to/tessdata
make check

这与 CONTRIBUTING.md 中"clone 需要包含全部子模块"的要求相互印证:make check 的通过是 PR 的硬性前提,而测试数据、字体、子模块三者缺一不可。

4. 发布:fork 推分支,再提交 PR

当"构建通过 + 测试通过"后,按文档流程发布改动:

  1. 若尚未操作,先在代码托管平台 fork 一份 tesseract 仓库;
  2. 在自己的 fork 上新建分支并推送改动;
  3. 从 fork 的该分支向主仓库发起 Pull Request。

5. 持续关注 CI 与质量扫描

文档最后一条要求:PR 期间要跟踪 CI(自动构建状态)Coverity / CodeQL(质量扫描) 的反馈;一旦指标显示你的改动造成退化,就需要进一步修复以改善它们。这构成了 PR 生命周期中"本地 make check 通过"之外的第二道、由仓库持续执行的验证。

三、快速检查清单

把全文压缩为可执行的检查清单,供报告问题或提交 PR 前自查:

报告 Issue 前:平台在受理范围内?已搜索现有 Issue/论坛?已读官方文档?针对最新官方版本?已用 tesseract CLI 复现?已用 tesseract --list-langs 确认 engosd 已安装?附件单文件 ≤ 20 MB、无隐私、无程序库、报错用文本而非截图?代码块用反引号、超长输出转 .txt 附件?已 Preview 复查?

提交 PR 前googletesttest 两个子模块已初始化(必要时先 make distclean 再重建)?make 构建通过?make check 全部 gtest 用例通过?训练相关改动已通过 make training 验证?fork 分支已推送、PR 已创建?CI 与 Coverity/CodeQL 指标无退化?

参考文件

文件 作用
CONTRIBUTING.md 本文主体:Issue/论坛分流规则与开发者 PR 流程
.gitmodules 定义 googletesttest 两个必需子模块
Makefile.am trainingcheckTESTS 等构建目标定义
autogen.sh 重新生成 autotools 构建脚本的辅助脚本
unittest/README.md 单元测试的数据目录、字体与运行步骤
src/tesseract.cpp --list-langs 命令行参数解析实现
登录后查看全文
热门项目推荐
相关项目推荐