news 2026/10/17 16:29:55

Ferret 开发工作流完全指南:构建、生成、测试、静态检查与基准测试入口全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ferret 开发工作流完全指南:构建、生成、测试、静态检查与基准测试入口全解析
  • 网页爬虫
  • 后端
  • 开发工具

【免费下载链接】ferret

Declarative data automation language and Go runtime for structured extraction workflows.

项目地址:https://gitcode.com/gh_mirrors/fe/ferret
点击查看免费下载

导读

本文基于 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.ymlCodeQL 静态分析设置及其生成路径

环境前置条件

  • 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/formatterFQL 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-32bit

test-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 格式化器或链接检查目标。对于纯文档改动:

  1. 直接核对相对链接与引用的路径;
  2. 运行git diff --check(检查空白错误);
  3. 审查完整 diff。

除非文档改动同时触及代码、生成产物或命令行为,否则不要运行无关的 Go 构建或集成套件。例如在文档中新增了指向 docs/maintainers/engineering/testing.md 的链接,只需人工确认目标文件存在并保持相对路径正确即可。

相关指南导航

  • 工程原则
  • Go 代码风格
  • 测试与性能
  • 架构总览
  • 运行时与生命周期
  • 调试器架构
  • 模块、SDK 与标准库
  • 发布自动化
  • 网页爬虫
  • 后端
  • 开发工具

【免费下载链接】ferret

Declarative data automation language and Go runtime for structured extraction workflows.

项目地址:https://gitcode.com/gh_mirrors/fe/ferret
点击查看免费下载
上一篇:Res2Net101d.in1k模型评估:如何在ImageNet-1k数据集上复现原始论文结果
下一篇:AssetRipper:把Unity资源包拆成原生工程的完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 14:27:59

cua:用AST解析与依赖图谱,生成Markdown导读快速理解代码库

1. 为什么会有 cua:一个关于“看不懂别人的代码”的故事先交代一下背景。前阵子接手了一个合作方移交过来的后端项目,仓库存量大概有十几万行代码,微服务和公共库混在一起,模块之间互相引用得像一盘意大利面。交接文档不是没有&am…

作者头像 李华
网站建设 2026/10/15 6:22:42

如何让项目从能用达到无可挑剔:细节标准与质量闭环实践

1. 一个词引发的思考:为什么"impeccable"值得单独拿出来聊第一次看到"impeccable"这个词被单独拎出来当作项目标题,我的反应是愣了一下。这不是一个技术名词,不是一个框架名,也不是某个工具或库的缩写。它就是…

作者头像 李华
网站建设 2026/10/13 23:22:45

用 __android_log_print(ANDROID_LOG_DEBUG, 打印出data_ptr[i]的值

在Android NDK开发中&#xff0c;__android_log_print 函数用于将日志信息输出到Logcat。如果你想打印出指针 data_ptr 指向的数组中第 i 个元素的值&#xff0c;你可以使用以下代码&#xff1a;cpp #include <android/log.h>// 假设 data_ptr 是一个指向 unsigned char …

作者头像 李华
网站建设 2026/10/15 11:43:46

PCA9422与MKV58F1M0VLQ24低功耗电源管理设计实战

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

作者头像 李华
网站建设 2026/10/13 14:37:44

软考中级软件设计师核心笔记:从背了忘到考场能写出来的复习路径

简介&#xff1a;这份《2024软考中级软件设计师核心笔记》面向备战全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试中级软件设计师科目的考生&#xff0c;尤其适合需要系统梳理上午基础知识与下午设计题型的备考人群。内容围绕考纲展开&#xff0c;覆盖计算…

作者头像 李华