ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

freehire 贡献者开发环境搭建完全指南:Make 命令、sqlc 再生成与 Pre-Commit 检查清单

freehire 贡献者开发环境搭建完全指南:Make 命令、sqlc 再生成与 Pre-Commit 检查清单

【免费下载链接】freehire

freehire — the open-source search engine for job seekers

项目地址:https://gitcode.com/GitHub_Trending/fr/freehire
点击查看免费下载

freehire 是一个开源的工作搜索引擎(job search engine),从数百个 ATS 招聘平台持续抓取职位,提供面状筛选、申请跟踪与 AI 分析能力。这篇指南帮助新贡献者从零搭起本地开发环境:涵盖最实用的make命令速查、sqlc代码再生成流程,以及一套与 CI 完全对齐的 pre-commit 检查清单。

一、安装前置依赖

在动手之前,先确认本机具备以下工具(详见 CONTRIBUTING.md 与 AGENTS.md):

工具用途说明
Go 1.26+后端编译与测试go.mod 声明go 1.26.9
Docker 或 Podman启动本地全套服务Makefile 会自动探测,docker 缺失时回退 podman,也可用make DOCKER=podman up手动指定
Node.js + pnpm前端(web/、design-system/)构建与检查浏览器扩展extension/使用 npm
lefthook、golangci-lint、gitleakspre-commit 钩子govulncheck可选,缺失时仅告警

克隆仓库并进入根目录:

git clone https://gitcode.com/gh_mirrors/fr/freehire cd freehire

💡 约定俗成的第一条规则:你必须理解自己提交的代码。小 PR 评审最快;架构级改动建议先开 issue 对齐方案。

二、make up 一键启动本地环境

freehire 的所有本地服务(Postgres + Meilisearch + Redis + S3 + API + 前端)都由 docker-compose.yml 编排,一条命令即可拉起:

make up # 等价于 docker compose up --build -d curl localhost:8080/health curl localhost:8080/api/v1/jobs

各服务与端口一览:

服务镜像默认端口
db(Postgres 18 + pgvector)pgvector/pgvector:pg185432
meilisearch(全文/面状搜索)getmeili/meilisearch:v1.49.07700
redis(限流)redis:7-alpine6379
s3(简历存储 mock)adobe/s3mock:5.2.39000
app(Go API)本地构建8080
web(SvelteKit SSR)本地构建8090

首次初始化卷时,migrations/目录会挂载进/docker-entrypoint-initdb.d,全部迁移自动执行。启动成功后,本地职位列表页面长这样:

两个高频运维命令:

make down # 停止并移除容器 make logs # 跟踪应用日志(compose logs -f app)

⚠️注意:修改已存在的迁移文件不会重新应用到已有卷上。需要重置数据库时执行docker compose down -v && make up,或对已有卷手动补跑make migrate。

三、两种本地开发模式

  1. 全 Docker 模式:make up,前后端全部跑在容器里,适合快速验证功能。
  2. 宿主机进程模式:数据库仍用容器,服务器跑在宿主机上,调试体验更好:
docker compose up -d db # 只启动数据库 make run # 宿主机上运行 server,读取 DATABASE_URL

宿主机模式下,把 .env.example 复制为.env按需调整——JWT_SECRET是必填项(缺失或不足 32 字节时服务器直接拒绝启动);OAuth 与 LLM 凭据均为可选项,不配置时对应功能自动降级为禁用。

如果服务器跑在宿主机上,部分功能还需要这些可执行文件在PATH中:

二进制包用途
pdftotextpoppler-utilsCV 文本提取,缺失时上传会报模糊的 "invalid PDF"
typst(0.15.0)静态发行版CV 的 PDF 导出,缺失时 PDF 端点返回 501
google-chrome/chromium可选仅自动投递等无头浏览器场景需要

启动整套服务后,你可以像真实用户一样体验 freehire 的面状筛选与保存过滤器:

四、Make 命令速查表

Makefile 提供了完整开发工作流,执行make help可随时查看全部命令:

命令作用
make up/make down启动 / 停止全套容器
make run在宿主机运行 API 服务器
make build编译出bin/hire二进制
make sqlc通过容器从 SQL 再生成数据库代码(无需本地安装 sqlc)
make reindex从 Postgres 全量重建 Meilisearch 职位索引
make psql直接进入数据库容器的 psql
make migrate对已有卷手动补跑迁移
make tidygo mod tidy整理依赖
make mail-preview渲染全部出站邮件并在浏览器打开预览
make gen-contracts从 Go 契约类型再生成web/src/lib/generated/contracts.ts
make gen-cities从 GeoNames 数据再生成城市表
make cv-previews从 CV 模板再生成 SVG 预览(需 typst)
make cover/cover-html单元测试覆盖率报告
make cover-integration集成标签测试覆盖率(需 Docker testcontainers)

五、sqlc 代码再生成流程

freehire 用 sqlc 实现"类型安全的数据库访问":你不写 ORM,你写 SQL,Go 代码由 sqlc 生成。关键路径:

  • 查询源文件:internal/platform/db/queries/(每个领域一张.sql文件)
  • 模式来源:migrations/
  • 生成物(已提交入库):internal/platform/db/

sqlc.yaml 将模式指向migrations、查询指向internal/platform/db/queries,输出到internal/platform/db,驱动为pgx/v5。

贡献者的铁律:

  1. 永远编辑queries/*.sql,不要手改internal/platform/db/下的生成代码;
  2. 每次修改查询或迁移后,立即执行make sqlc并提交再生成结果——该命令通过容器运行固定版本(1.31.1)的 sqlc,团队之间零版本漂移;
  3. 永远不要修改已应用的迁移,一律新增迁移文件(expand/contract 策略)。
make sqlc # 一行完成:docker run sqlc generate

pre-commit 阶段有专门的sqlc-drift钩子替你兜底:它会重新执行make sqlc,如果发现 internal/platform/db/ 下出现未暂存的漂移(包括从未提交的新文件),直接拦截提交——"改了查询却没再生成"这种事故在本地就会被拦下。

六、安装 pre-commit 钩子(lefthook)

钩子配置集中在 lefthook.yml,每个克隆只需安装一次:

go install github.com/evilmartians/lefthook@latest lefthook install

主要检查项按职责分组:

钩子检查内容特点
go-fmt/go-vet暂存的 Go 文件格式与静态检查基础卫生
golangci-lint静态分析棘轮模式:只对本次改动引入的新问题失败,历史欠债不阻塞
govulncheckGo 标准库/依赖漏洞当前仅告警(warn-only)
sqlc-drift生成代码是否过期自动再生成并比对
sql-migrations新增迁移的 squawk 检查由 scripts/check-migrations.mjs 执行,只查本次新增的迁移
doc-links全仓库相对 Markdown 链接可达性scripts/check-doc-links.mjs,防止文档链接悄悄失效
gitleaks暂存区密钥扫描唯一"预防"而非"报告"的钩子:未安装时直接失败,拒绝假装扫描过
web-lint/extension-lint前端 eslint分别覆盖web/与extension/
design-system-*设计系统 lint / check / test / dist / tokens对齐design-systemCI 的快速检查

💡 棘轮策略与 CI 完全一致,所以本地通过 ≈ CI 通过;gitleaks与 CI 的gitleaksworkflow 是"两道闸门、两个时刻",--no-verify跳过本地钩子后,CI 仍会扫描全部历史。

七、提交前自检清单(与 CI 对齐)

改完代码、推送之前,把这组命令跑一遍(摘自 CONTRIBUTING.md):

gofmt -l . # 必须无输出 go build ./... go vet ./... go test ./... # 单元测试(无外部依赖) go vet -tags=integration ./... # 廉价守卫:编译带 integration 标签的文件,秒级

如果改动涉及 Docker 依赖行为(查询、schema、handler),再跑完整集成套件:

go test -tags=integration ./... # 需要 Docker(testcontainers)

⚠️go test ./...不会编译任何//go:build integration文件——只改签名也能骗过前三条命令,vet -tags=integration是防漏网的最便宜保险,建议每次推送前都执行。

前端改动(web/)则按顺序构建,design-system 必须先于消费方:

cd design-system && pnpm install && pnpm build cd ../web && pnpm install && pnpm run check && pnpm run build

提交前再生成清单——源变了,产物必须一起提交:

  • 改了internal/platform/db/queries/*.sql或migrations/→ 执行make sqlc
  • 改了 Go 契约类型 → 执行make gen-contracts

八、常见问题速答

  • 8080 端口被占用?换宿主机端口再启动:HIRE_HOST_PORT=8090 make up(DB_HOST_PORT、MEILI_HOST_PORT同理)。
  • 改了迁移但数据库没生效?已初始化的卷不会重放迁移:docker compose down -v && make up重置,或make migrate手动补跑。
  • 钩子报 "Generated code was stale"?说明make sqlc刚替你修好了漂移,把结果git add进本次提交即可。
  • 能用--no-verify跳过钩子吗?能,但 CI 会重新检查并扫描完整历史——本地跳过只是让红色结果来得更早一点。

环境就绪后,从一个小 PR 开始:修一个 typo、补一个测试、给 cmd/ 下某个 worker 加文档,都是被欢迎的贡献方式。祝提交顺利 🚀

【免费下载链接】freehire

freehire — the open-source search engine for job seekers

项目地址:https://gitcode.com/GitHub_Trending/fr/freehire
点击查看免费下载
上一篇:端侧多模态新王之争:MiniCPM-V 4.7、Qwen2.5-Omni 与 4.6,谁配得上"国产小钢炮"
下一篇:从.pt到.om一条命令:Yolov11-ACC的ONNX→ATC导出链路与三方代理验证法

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进