Logofpack

Architecture and development

How fpack is built, and how to develop and release it.

架构与开发

fpack 的结构,以及如何开发和发布。

fpack/
  bin/fpack.dart            Dart entry point (pub executable)
  lib/src/                  launcher: platform detection, core resolution (cache → bundled → download → local go build), SHA-256, signal forwarding
  go/                       native core (Go, dependencies vendored)
    cmd/fpack-core/         main
    internal/cli            argument parsing, commands, help
    internal/build          orchestration: classify → preflight → shared flutter steps → package → checksums → summary
    internal/targets        per-target preflight, flutter args, artifact lookup, packaging commands (dry-run and real run share the code)
    internal/config         key registry (drives env vars, validation, JSON Schema, init template and doc tables), fpack.yaml parsing
    internal/project        pubspec / Gradle / Xcode project info (read-only)
    internal/flutter        Flutter SDK lookup (FVM / PATH / …)
    internal/runner         subprocesses (process groups, Ctrl-C, logs, secret redaction)
    internal/hints          common errors → fixes
    internal/ui, i18n, pack, host, doctor, version
  schema/                   fpack.schema.json (generated from the key registry)
  prebuilt/                 prebuilt binaries + manifest.json (release artifacts, not in git)
  scripts/                  build_binaries.sh, check_versions.sh, package_dist.sh, e2e_*.py + fake-apple/ (E2E)
  website/                  documentation site (Jaspr; generated tables come from the Go tests)
  .github/workflows/        ci.yml (tests + lint), e2e.yml, docs.yml, release.yml

Development and releases#

cd go && go vet ./... && go test ./...      # Go core
FPACK_UPDATE=1 go test ./internal/config    # after changing the key registry: regenerate the schema and doc/configuration.md tables
dart pub get && dart analyze && dart test   # Dart launcher
scripts/build_binaries.sh                   # cross-compile 6 platforms → prebuilt/
scripts/package_dist.sh ../fpack-dist.tar.gz  # self-contained offline bundle
FPACK_CORE=$PWD/prebuilt/darwin-arm64/fpack-core fpack doctor   # debug with a specific core

Releasing: bump the version in pubspec.yaml, lib/src/version.dart and go/internal/version/version.go together (scripts/check_versions.sh checks them), update CHANGELOG.md, push a vX.Y.Z tag. release.yml cross-compiles, creates the GitHub Release (binaries + checksums.txt + offline bundle) and optionally publishes to pub.dev.

fpack/
  bin/fpack.dart            Dart 入口(pub executable)
  lib/src/                  启动器:平台识别、核心解析(缓存 → 预编译 → 下载 → 本机编译)、SHA-256、信号转发
  go/                       原生核心(Go,依赖已 vendor)
    cmd/fpack-core/         main
    internal/cli            参数解析、命令、帮助
    internal/build          构建编排:分类 → 预检 → 共享 flutter 步骤 → 打包 → 校验和 → 汇总
    internal/targets        每个目标的预检、flutter 参数、产物定位、打包命令(dry-run 与真实执行同一份代码)
    internal/config         键注册表(驱动环境变量、校验、JSON Schema、init 模板与文档表格)、fpack.yaml 解析
    internal/project        pubspec / Gradle / Xcode 工程信息读取(只读)
    internal/flutter        Flutter SDK 查找(FVM / PATH / …)
    internal/runner         子进程(进程组、Ctrl-C、日志、密钥脱敏)
    internal/hints          常见错误 → 修复建议
    internal/ui, i18n, pack, host, doctor, version
  schema/                   fpack.schema.json(由键注册表生成)
  prebuilt/                 预编译二进制 + manifest.json(发布产物,不进 git)
  scripts/                  build_binaries.sh、check_versions.sh、package_dist.sh、e2e_*.py + fake-apple/(E2E)
  website/                  文档网站(Jaspr;生成的表格来自 Go 测试)
  .github/workflows/        ci.yml(测试 + lint)、e2e.yml、docs.yml、release.yml

开发与发布#

cd go && go vet ./... && go test ./...      # Go 核心
FPACK_UPDATE=1 go test ./internal/config    # 修改键注册表后重新生成 schema 与 doc/configuration.md 表格
dart pub get && dart analyze && dart test   # Dart 启动器
scripts/build_binaries.sh                   # 交叉编译 6 个平台 → prebuilt/
scripts/package_dist.sh ../fpack-dist.tar.gz  # 自包含离线安装包
FPACK_CORE=$PWD/prebuilt/darwin-arm64/fpack-core fpack doctor   # 用指定核心调试

发布:同时修改 pubspec.yaml、lib/src/version.dart、go/internal/version/version.go 中的版本号(scripts/check_versions.sh 会检查),更新 CHANGELOG.md,推送 vX.Y.Z 标签。release.yml 会交叉编译、创建 GitHub Release(二进制 + checksums.txt + 离线包),并可选发布到 pub.dev。