flutter_buildkit 0.2.2
flutter_buildkit: ^0.2.2 copied to clipboard
Interactive console app that builds Flutter APK, AAB and IPA files with flavors, keeps a ledger of every build and traces crashes from symbols.
0.2.2 - 2026-10-06 #
- Menus now use the terminal's height. The visible list was capped at 20 rows, reserved 8 rows for the rest, and was measured once when the menu opened. It is now measured on every redraw (so resizing works), reserves only the rows actually drawn, and shows "more above/below" only when items are really hidden. The indicator lines count toward the row budget.
- CI no longer runs on every pull request push: it runs when a PR is marked
ready for review, on
main, and on demand.
0.2.1 - 2026-10-06 #
- Menus no longer repeat their heading on every arrow key: list lines are cut to the terminal width so redraws stay in place.
- build_runner now runs as
dart run build_runner build(flutter pub runis deprecated), and--delete-conflicting-outputsis no longer a default (newer build_runner ignores it).pre_build.build_runner_argsstill passes anything you set.
0.2.0 #
Safety release. Behavior changes are marked Changed.
- Delete is hardened. A build folder must lie strictly inside the ledger's
folder after resolving symlinks, must not contain another build, and must
hold a
build_info.jsonwith the build's id; released builds' artifact paths are checked the same way.BuildManager.deletegaineddryRun. - Failed builds are recorded. The folder is kept with a new
build.log(the output offlutter build), and the ledger gets a row with statusfailed, the exit code and the command line. Failed rows cannot be published, uploaded or have symbols sent.BuildRecordgainedfailure,commandandisFailed;BuildStatusgainedfailed. - Every build now stores the command line it ran (
command). - Ctrl-C during a build stops
flutterand removes the unfinished folder (InterruptGuard). - The build id is chosen before the build, so a duplicate id can no longer reject a finished build.
- Changed:
play.default_release_statusnow defaults todraft(it wascompleted). The menu pre-selects draft, shows a summary before uploading, and the production track needsproductiontyped to confirm. Setdefault_release_status: completedto keep the old behavior. - Changed:
ProcessRunner.streamhas a new optionallogFile; subclasses that override it must accept it. With a log file the output is copied to the console and the file, soflutterno longer sees a terminal for that run. - CSV and TSV exports neutralize cells that start with
=,+,-,@, a tab or a carriage return. They also gain the columnstarget,command,failure_exit_codeandplay_edit_idat the end. - Changed:
configshowsset (N chars)for secrets instead of the first four characters. - The menu warns when a delete removes the symbols of a build that was once published and then unmarked.
Command line and CI:
- New non-interactive commands:
build,publish,mark,symbols,traceanddelete(with--dry-run/--yes). They never prompt, accept--jsonand return stable exit codes (ExitCodes): 69 upload failed, 70 build failed, 71 trace failed, 72 delete failed. The same code is available asCliin the library. Seedoc/ci.md. listandexportgained--flavor,--status,--sinceand--limit;list --jsonprints the rows; the table has a Status column.list,export,markanddeletework outside a Flutter project when--ledgeris given.exportcreates missing parent folders.- Changed:
initexits 73 (was 1) when the config file exists. - Output files are found without clocks: the output folders are snapshotted
before
flutter build, theBuilt <path>lines Flutter prints are used first, and otherwise the files that are new or changed are taken. A flavor must match a whole part of the file name (prono longer matchesapp-production-release.apk). When several candidates are left and the build is not split per ABI the build fails with the list instead of guessing. - GitHub Actions workflow: format, analyze and tests on Linux, macOS and
Windows, plus a
pub publish --dry-run.
Ledger, Google Play and library:
- The ledger takes a lock file around every change and re-reads the file
first, so two processes no longer overwrite each other's rows. A bad ledger
file blocks a write instead of being replaced. The first save of each day
keeps a copy in
.history/(seven days) next to the existing.bak.LedgergainedlockWaitandhighestVersionCode. - Google Play: the track is read before it is changed. A staged or halted
rollout is no longer dropped silently: the upload throws
PlayTrackInUseExceptionunlessreplaceExisting(--replace-existing) is set; the menu asks.PlayPublishertakes anhttpClient, which is also what makes it testable withpackage:http/testing.dart(new direct dependencyhttp). - Changed: the library no longer exports the menu (
App), the settings and launch.json screens, orWindowsConsole.CliandExitCodesare public. - Config:
flutter_buildkit.local.yamlis merged over the shared config. The shared file is now meant to be committed; auto-configuration offers to ignore the local overlay instead of the main file. Thefluttercommand and string settings split on whitespace but honor quotes, so paths with spaces work (splitCommandLine). - A warning is shown when the version code is not higher than one already in
the ledger for the app (menu and
build). - Releases carry more provenance.
BuildRecordgainedsigning(certificate SHA-256 and subject, read withapksignerorkeytool; a warning when a release is debug-signed or differs from earlier releases of the package),buildIds(ELF build ids of the Dart symbols) andenvironment(OS, host, Flutter channel and revision, Dart SDK, engine, hash of the dart-define file).trace autoand the menu match a crash'sbuild_id(or version) to a build and warn on a mismatch. - Google Play pre-flight:
publishstops before uploading when the version code is already on Play (any track) or the AAB is debug-signed.PlayPublisher.checkAccessbacksdoctor --online. - New commands:
doctor(tools, Play key, disk, output folder; exit 75),verify(ledger vs disk: files, hashes, symbols, orphans; exit 76) andprune(old logs, failed builds, uploaded symbols perretention:).list/exportgot--bom; the menu's CSV export writes a BOM for Excel. - Changed: an upload to the
internaltrack no longer makes a build immortal. What keeps symbols and the row on delete isdelete_policy.retain_on(defaultpublished, alpha, beta, production;playrestores "any upload"). Deleting a build that was published once and unmarked needs its id typed (menu) or--force. - Changed: the ledger JSON stores
publishedAt,playandsymbolUploadsat the top level;statusis derived and ignored on load. Files from 0.1.x are still read, and a file saved by 0.2 keeps older tools working only for the derived fields. - Changed: a config that names executables in the shared file
(
flutter,*.cli,android.*) must be trusted: the menu asks once, the non-interactive commands exit 78 until--trust-config/FBK_TRUST_CONFIG=1. Warnings for a Sentry token in the YAML and an un-ignored Play key inside the project.AppConfiggainedsharedCommands,warnings,retainOn,logRetentionDaysandsymbolsKeepLast; newConfigTrust. - Mapping and native symbol folders are found by listing
outputs/mapping/, so multi-dimension flavors (devFreeRelease) work. - Docs: Crashlytics and the R8 mapping, Firebase auth in CI, trusting a config, provenance, verify and prune.
- Docs: README (install globally,
dart run flutter_buildkit:fbk), newdoc/ci.mdanddoc/security.md, config overlay and ledger lock.
0.1.2 #
- Added an
example/folder with runnable examples by topic (library API, configuration, layouts and naming, ledger and exports, symbols and traces, VS Code and auto-configuration, CLI and prompts) andexample/README.md. - README rewritten: shorter, with a table of contents; the full reference moved
to
doc/configuration.md,doc/project-setup.mdanddoc/builds-and-ledger.md. - Documented the library and
ConsoleAbort, so every public symbol has docs. - Fix: the command line now exits with its error code (64 usage, 66 no project, 74 ledger, 78 config); it always exited 0 before.
- Docs:
output_dirdoes not expand~; use an absolute or relative path.
0.1.1 #
- README: install from pub.dev instead of git.
0.1.0 #
- First release.
- Interactive menu that builds APK, AAB and IPA files for any mix of flavors,
entry points and modes, with optional
flutter clean,build_runnerandflutter gen-l10nfirst. - JSON build ledger with status, condition and history per build; CSV and TSV export.
- Organised output folders and file names, configurable with layout presets or templates.
- Stores Dart, native and R8 mapping symbols; uploads them to Crashlytics and Sentry; traces crashes from the stored symbols.
- Google Play upload through the API, or marking a build uploaded or published in the ledger.
- Settings editor, auto-configuration from the project, and VS Code
launch.jsongeneration.