Replace manual generate_version.dart script with a custom build_runner builder that automatically generates lib/version.g.dart from pubspec.yaml during the build process. This eliminates manual steps and ensures version info stays in sync. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
50 lines
1.6 KiB
Dart
50 lines
1.6 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:build/build.dart';
|
|
import 'package:yaml/yaml.dart';
|
|
|
|
/// Builder that generates version.g.dart from pubspec.yaml.
|
|
Builder versionBuilder(BuilderOptions options) => VersionBuilder();
|
|
|
|
class VersionBuilder implements Builder {
|
|
@override
|
|
final buildExtensions = const {
|
|
r'$package$': ['lib/version.g.dart'],
|
|
};
|
|
|
|
@override
|
|
Future<void> build(BuildStep buildStep) async {
|
|
final pubspecId = AssetId(buildStep.inputId.package, 'pubspec.yaml');
|
|
final pubspecContent = await buildStep.readAsString(pubspecId);
|
|
final pubspec = loadYaml(pubspecContent) as YamlMap;
|
|
|
|
final name = pubspec['name'] as String;
|
|
final description = pubspec['description'] as String? ?? '';
|
|
final versionString = pubspec['version'] as String;
|
|
|
|
// Parse version: "0.2.0+2" -> version="0.2.0", buildNumber=2
|
|
final versionParts = versionString.split('+');
|
|
final version = versionParts[0];
|
|
final buildNumber = versionParts.length > 1 ? int.parse(versionParts[1]) : 0;
|
|
|
|
final output = '''
|
|
// GENERATED FILE - DO NOT EDIT
|
|
// Generated by build_runner from pubspec.yaml
|
|
|
|
/// Application version information from pubspec.yaml
|
|
class AppVersion {
|
|
AppVersion._();
|
|
|
|
static const String name = '$name';
|
|
static const String description = '$description';
|
|
static const String version = '$version';
|
|
static const int buildNumber = $buildNumber;
|
|
static const String fullVersion = '$version+$buildNumber';
|
|
}
|
|
''';
|
|
|
|
final outputId = AssetId(buildStep.inputId.package, 'lib/version.g.dart');
|
|
await buildStep.writeAsString(outputId, output);
|
|
}
|
|
}
|