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 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); } }