- 网页爬虫
- 后端
- 开发工具
【免费下载链接】ferret
Declarative data automation language and Go runtime for structured extraction workflows.
导读
本文基于 Ferret(声明式数据自动化语言与 Go 运行时)仓库维护者文档 docs/maintainers/engineering/workflow.md,系统梳理该仓库的构建、代码生成、测试、Lint 与基准测试全部入口。你将掌握Makefile各目标的确切职责与副作用、Go 版本与工具链前置条件、ANTLR 4.13.2 驱动的 FQL Parser 再生成流程、三层测试布局与 Linux/386 交叉验证,以及基准测试的过滤与基线对比机制,从而能够独立、安全地完成从改代码到提交的全流程操作。
权威依据与前置条件:四条“事实来源”
workflow 文档明确了一条原则:go.mod、Makefile与 GitHub Actions 工作流定义是权威,本文档描述当前工作流;版本或命令一旦变化,以权威文件为准。
| 权威文件 | 角色 |
|---|---|
| go.mod | 声明最低 Go 版本(当前为go 1.25)与根模块依赖(如github.com/MontFerret/api v1.0.0-alpha.19、github.com/antlr4-go/antlr/v4 v4.13.1等) |
| Makefile | 定义本地命令并固定辅助 Go 工具的精确版本 |
| .github/workflows/build.yml | 主 CI 矩阵与校验路径 |
| .github/workflows/benchmark.yml | 自动化基准采集与对比 |
| .github/workflows/codeql.yml | CodeQL 静态分析设置及其生成路径 |
环境前置条件
- Go:必装,版本满足
go.mod的go 1.25要求(CI 矩阵还验证 1.25/1.26/1.27)。 - Make:仓库推荐的首选入口。
- 辅助工具:Lint 与格式化目标要求
make install-tools安装的精确版本——staticcheck(v0.7.0)、fieldalignment(golang.org/x/tools的v0.49.0)、goimports(同版本)、benchstat(golang.org/x/perf固定 commit)与revive(v1.15.0)。版本号均来自 Makefile。 - Parser 再生成:额外需要 Java 与由 ANTLR 4.13.2 支撑的
antlr包装脚本,与生成文件头及 CI 设置严格一致(CI 中通过下载antlr-4.13.2-complete.jar并构造$HOME/antlr-bin/antlr包装脚本实现,见 build.yml 与 codeql.yml)。官方工作流强调:不要在其他地方重复安装脚本,直接查阅工作流文件。 - 独立 Go 模块:API 参考与发布工具位于
tools/apiref、tools/apipublish,各自有独立go.mod。根目标通过go -C切换到其模块目录执行。
Make 目标全景:职责、副作用与选择策略
下表完整罗列 Makefile 的核心目标:
| Target | 用途 |
|---|---|
make build | 依次执行 lint、generate/格式化、全部测试,并编译测试 CLI 测试工具 |
make install-tools | 安装 Makefile 选定的精确辅助工具版本 |
make compile | 将 test/cli.go 编译为bin/ferret;这是仓库测试工具,不是独立的 MontFerret CLI 产品 |
make compile-32bit | 以 CGO 禁用、Linux/386 为目标交叉编译根模块全部生产与测试包;测试二进制不执行 |
make test | 运行 unit/race、integration/race 与 security 三套件 |
make test-32bit | 在 Linux/386、CGO 禁用、无 race 检测器下运行根模块与两个独立 API 工具模块的全部测试 |
make test-unit | 运行启用 race 的包、脚本、工具模块、兼容性与根测试 |
make test-integration | 运行启用 race 的test/integration下测试 |
make test-security | 不带 race 标志运行test/security |
make cover | 运行包覆盖率并经由配置的 Codecov 脚本上传 |
make lint | 以仓库排除规则运行staticcheck与revive |
make fmt | 对配置的根目录应用字段对齐、Go 格式化与导入格式化 |
make generate | 运行包生成后执行make fmt |
make bench-unit | 以可配置过滤器与次数运行包级基准 |
make bench-integration | 运行test/benchmarks下基准 |
make bench | 同时运行上述两组基准 |
目标实现细节(源码级)
build:build: lint generate test compile,即四个阶段串行;default: build,所以不带参数直接执行make等价于完整校验链。install-tools逐条go install固定版本(见 Makefile),与 CI 中make install-tools完全一致。compile:go build -v -o bin/ferret test/cli.go,产物是仓库内的测试 CLI 测试工具,勿与产品 CLI 混淆。compile-32bit:先GOOS=linux GOARCH=386 CGO_ENABLED=0 go build ./...,再go test -run '^$' -exec=true ./...编译测试包而不执行二进制。test-unit:CGO_ENABLED=1 go test -race pkg/... uapi/... scripts/...,再分别用go -C进入两个工具模块跑 race 测试,最后go test -race compat/... .(根模块)。注意:race 检测器需要 CGO,因此这些目标显式设置CGO_ENABLED=1。test-security:go test test/security/...,不带 race。cover:go test -coverprofile=coverage.txt -covermode=atomic pkg/... uapi/...后curl ... codecov.io/bash | bash上传。
关键警示:多个目标具有“副作用”
文档明确警告以下目标会修改仓库或外部状态,必须按任务选择,而非盲目运行最宽泛目标:
make fmt:直接重写 Go 文件;make generate:重写生成产物并随后格式化;make clean:删除本地构建与覆盖率输出(rm -rf bin/* coverage.txt并go clean -testcache);make cover:执行外部上传(Codecov)。
因此,若你只想做格式化,不要顺手跑make build。
Parser 再生成:ANTLR 4.13.2 与 FQL 语法
go:generate 指令
pkg/parser/parser.go 顶部的go:generate指令是再生成的入口:
antlr -Xexact-output-dir -o fql -package fql -visitor -Dlanguage=Go antlr/FqlLexer.g4 antlr/FqlParser.g4 go run ./tools/patch_lexer.go参数含义:-Xexact-output-dir保证输出目录精确;-o fql输出到pkg/parser/fql;-package fql指定 Go 包名;-visitor生成访问器;-Dlanguage=Go生成 Go 代码;随后运行./tools/patch_lexer.go对词法器补丁。
语法源与生成产物
- 语法源:pkg/parser/antlr/FqlLexer.g4 与 pkg/parser/antlr/FqlParser.g4;
- 生成产物包括词法记号表
pkg/parser/antlr/FqlLexer.tokens,以及pkg/parser/fql下的fql_lexer.go、fql_parser.go、fqlparser_listener.go、fqlparser_visitor.go、fqlparser_base_listener.go、fqlparser_base_visitor.go,外加.interp解释文件(见 pkg/parser/fql)。
运行时,parser.go 通过antlr.NewInputStream构造输入流、套用大小写归一化流、创建FqlLexer与FqlParser,并允许传入TokenStreamTransformer对 token 流做变换。
操作纪律
- 仅在你修改了语法或生成器输入后才运行
make generate; - 必须审查生成的产物以及目标产生的格式化改动;
- 绝不手改生成的 parser 产物或 token 词表——修改权威语法或生成器输入,而不是产物;
- 语法变更通常需要协调:语法文件、生成的 parser、诊断/解析集成、编译器 lowering、formatter 与集成测试覆盖。审查全部生成改动,并与其源改动一起提交。
测试布局:三层结构与本地方针
包测试就近原则与分层
- 原生嵌入生命周期与组合测试位于 pkg/engine:组件测试位于
pkg/engine/internal/bootstrap、pkg/engine/internal/host、pkg/engine/internal/resource、pkg/engine/internal/session。- Bootstrap 测试覆盖:构造所有权转移、回滚顺序与错误、初始化钩子快照。
- Session 组件测试覆盖:获取失败与 panic 回滚、转移到普通执行或调试器服务、精确的 permit/VM 释放、并发清理、物化错误分离。
- 原生测试在不访问执行内部的前提下,保留准入、取消、选项、钩子与输出契约。
- 根测试守护精装外观(façade)的导出声明、类型别名、函数签名、常量与公共嵌入行为。
uapi(Universal API 适配器):根级目录,容纳适配器测试、外部包示例与基准,并显式纳入 unit/race、覆盖率、单元基准、静态分析与导入格式化(与pkg/...并列)。
附加套件分组
| 目录 | 覆盖内容 |
|---|---|
| test/integration/compiler | 语言编译与语义行为 |
| test/integration/optimization | 优化器等价与 lowering 行为 |
| test/integration/vm | 跨层执行行为 |
| test/integration/formatter | FQL formatter 行为 |
| test/security | 安全导向回归覆盖 |
| test/spec | 共享测试辅助与规范 fixture |
| test/benchmarks | 跨层集成基准 |
选择覆盖与检查时参考 testing 与校验策略。启用 race 的 Make 目标需要 CGO。
go test ./...的定位
go test ./...是对根 Go 模块有用的宽泛、非 race 检查,但它不覆盖两个独立工具模块,也无法复现make test的完整 race 与安全组合。需要完整验证时务必使用make test及其子目标。
Linux/386 验证:交叉编译与完整套件
主 CI 工作流维护与 64 位构建矩阵 Go 版本一致的独立 Linux/386 矩阵(见 build.yml),每个 job 依次运行make compile-32bit与make test-32bit。矩阵fail-fast: false,因此某个 Go 版本失败不会取消其他版本。
compile-32bit:仅编译、不执行
该目标可从其他受支持的 Go 构建主机工作。它通过go test -run '^$' -exec=true ./...编译根模块测试包而不执行其二进制。若你的主机能直接运行 Linux/386 二进制,则可执行完整套件:
make test-32bittest-32bit:完整套件执行
目标设置GOOS=linux GOARCH=386 CGO_ENABLED=0,在根模块与两个独立 API 工具模块(tools/apiref、tools/apipublish)中运行go test -count=1 ./...(见 Makefile)。这涵盖单元、集成、安全、兼容、脚本与工具测试;测试缓存被禁用;基准与扩展 fuzzing 保持分离。Linux/386 套件不带 race 检测器运行,而既有 64 位构建、覆盖率、安全与 race job 保持其覆盖。
基准测试:过滤变量与基线对比
可配置的 Make 变量
| 变量 | 作用 | 默认值 |
|---|---|---|
BENCH_RUN | 选择伴随基准运行的测试 | 无('^$',即不运行测试) |
BENCH_FILTER | 按名称选择基准 | 全部(.) |
BENCH_COUNT | 控制重复次数 | 1 |
BENCH_TIMEOUT | 控制 Go 测试超时 | 30m |
示例(来自文档,与 Makefile 变量定义吻合):
make bench-unit BENCH_FILTER='Comparison' BENCH_COUNT=5 make bench-integration BENCH_FILTER='Compiler' BENCH_COUNT=5 BENCH_TIMEOUT=15m基线对比机制
基线与对比要求详见 benchmark 策略。基准工作流(.github/workflows/benchmark.yml)在main分支 push 时记录 main 基线到gh-pages(分别以Ferret Go Benchmarks - Unit与- Integration名称、dev/bench/unit与dev/bench/integration数据目录存储);对 pull request 运行单元基准对比;集成对比则通过配置的标签ci/run-bench-integration或手工输入(workflow_dispatch的run_integration_compare)把关。当前标签、阈值(alert-threshold: '150%')与产物名称均由工作流文件持有,版本变化时以该文件为准。
何时必须跑基准
“显著变更”的判定与操作步骤见 testing.md:凡是可能影响执行吞吐、编译时间、常见路径延迟、分配、内存复用、池化、清理、物化、优化器输出或代码生成的改动(典型如pkg/vm、pkg/runtime、pkg/compiler、pkg/bytecode、pkg/encoding、parser/compiler 热路径、所有权追踪、缓存、池化、寄存器分配或执行路径上的调试器钩子),都应遵循“实现前记录基线 → 同环境实现后复测 → 对比ns/op、B/op、allocs/op→ 调查有意义回退 → 无相关基准时新增 → 记录确切命令与汇总增量”六步流程;同时牢记“绝不为了投机性微优化牺牲明确正确性或可维护性”。
文档-only 变更:轻量校验清单
当前仓库没有Markdown 格式化器或链接检查目标。对于纯文档改动:
- 直接核对相对链接与引用的路径;
- 运行
git diff --check(检查空白错误); - 审查完整 diff。
除非文档改动同时触及代码、生成产物或命令行为,否则不要运行无关的 Go 构建或集成套件。例如在文档中新增了指向 docs/maintainers/engineering/testing.md 的链接,只需人工确认目标文件存在并保持相对路径正确即可。
相关指南导航
- 工程原则
- Go 代码风格
- 测试与性能
- 架构总览
- 运行时与生命周期
- 调试器架构
- 模块、SDK 与标准库
- 发布自动化
- 网页爬虫
- 后端
- 开发工具
【免费下载链接】ferret
Declarative data automation language and Go runtime for structured extraction workflows.
相关推荐
Bluebird 贡献开发指南:构建、测试与基准测试全流程解析
Bluebird 贡献开发指南:构建、测试与基准测试全流程解析 本篇指南基于 Bluebird 官方 贡献指南 https://link.gitcode.com
后端Apache Arrow JS 开发者指南:构建、测试、基准测试与 FlatBuffers 代码生成全解析
Apache Arrow JS 开发者指南:构建、测试、基准测试与 FlatBuffers 代码生成全解析 导读 本文以仓库中 js/DEVELOP.md ht
数据工程大数据序列化数据分析Hatch 项目贡献指南:从测试、静态检查到文档构建的完整开发工作流
Hatch 项目贡献指南:从测试、静态检查到文档构建的完整开发工作流 本指南以 Hatch 仓库的 docs/community/contributing.md
开发工具CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考