Skip to content

Commit 1691d9b

Browse files
authored
build_runner watch support (#221)
* Add build_runner watch support * revert pubspec.lock * remove font assets from compare method we don't need to check fonts assets because only fonts declaration in pubspec.yaml makes sense
1 parent 396aee9 commit 1691d9b

File tree

6 files changed

+108
-22
lines changed

6 files changed

+108
-22
lines changed

packages/core/lib/flutter_generator.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,29 @@ class FlutterGenerator {
2424
final String colorsName;
2525
final String fontsName;
2626

27-
Future<void> build() async {
28-
stdout.writeln(flutterGenVersion);
27+
Future<Config?> getConfig() async {
2928
Config config;
29+
3030
try {
3131
config = await loadPubspecConfig(pubspecFile);
3232
} on InvalidSettingsException catch (e) {
3333
stderr.writeln(e.message);
34-
return;
34+
return null;
3535
} on FileSystemException catch (e) {
3636
stderr.writeln(e.message);
37-
return;
37+
return null;
3838
}
3939

40+
return config;
41+
}
42+
43+
Future<void> build({Config? config}) async {
44+
stdout.writeln(flutterGenVersion);
45+
46+
config ??= await getConfig();
47+
48+
if (config == null) return;
49+
4050
final flutter = config.pubspec.flutter;
4151
final flutterGen = config.pubspec.flutterGen;
4252
final output = config.pubspec.flutterGen.output;

packages/core/lib/settings/config.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import '../utils/map.dart';
77
import 'pubspec.dart';
88

99
class Config {
10-
Config._({required this.pubspec});
10+
Config._({required this.pubspec, required this.pubspecFile});
1111

1212
final Pubspec pubspec;
13+
final File pubspecFile;
1314
}
1415

1516
Future<Config> loadPubspecConfig(File pubspecFile) async {
@@ -26,7 +27,7 @@ Future<Config> loadPubspecConfig(File pubspecFile) async {
2627
final defaultMap = loadYaml(_defaultConfig) as Map?;
2728
final mergedMap = mergeMap([defaultMap, userMap]);
2829
final pubspec = Pubspec.fromJson(mergedMap);
29-
return Config._(pubspec: pubspec);
30+
return Config._(pubspec: pubspec, pubspecFile: pubspecFile);
3031
}
3132

3233
const _defaultConfig = '''

packages/runner/build.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ builders:
88
flutter_gen_runner:
99
import: "package:flutter_gen_runner/flutter_gen_runner.dart"
1010
builder_factories: [ "build" ]
11-
build_extensions: { "$lib$": [ ".gen.dart" ] }
11+
build_extensions: { "$package$": [ ".gen.dart" ] }
1212
auto_apply: dependents
1313
build_to: source
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import 'dart:async';
2+
import 'dart:collection';
3+
import 'dart:io';
4+
5+
import 'package:build/build.dart';
6+
import 'package:collection/collection.dart';
7+
import 'package:crypto/crypto.dart';
8+
import 'package:flutter_gen_core/flutter_generator.dart';
9+
import 'package:flutter_gen_core/settings/config.dart';
10+
import 'package:glob/glob.dart';
11+
12+
class FlutterGenBuilder extends Builder {
13+
final FlutterGenerator generator = FlutterGenerator(File('pubspec.yaml'));
14+
_FlutterGenBuilderState? _currentState;
15+
16+
@override
17+
Future<void> build(BuildStep buildStep) async {
18+
var config = await generator.getConfig();
19+
20+
if (config == null) return;
21+
22+
var state = await _createState(config, buildStep);
23+
24+
if (_currentState != null && _currentState!.equals(state)) return;
25+
26+
_currentState = state;
27+
28+
await generator.build(config: config);
29+
}
30+
31+
@override
32+
Map<String, List<String>> get buildExtensions => {
33+
"\$package\$": ['.gen.dart']
34+
};
35+
36+
Future<_FlutterGenBuilderState> _createState(
37+
Config config, BuildStep buildStep) async {
38+
final pubspec = config.pubspec;
39+
final HashMap<String, Digest> colors = HashMap();
40+
final HashSet<String> assets = HashSet();
41+
42+
if (pubspec.flutterGen.colors.enabled) {
43+
for (var colorInput in pubspec.flutterGen.colors.inputs) {
44+
if (colorInput.isEmpty) continue;
45+
await for (var assetId in buildStep.findAssets(Glob(colorInput))) {
46+
var digest = await buildStep.digest(assetId);
47+
colors[assetId.path] = digest;
48+
}
49+
}
50+
}
51+
52+
if (pubspec.flutterGen.assets.enabled) {
53+
for (var assetInput in pubspec.flutter.assets) {
54+
if (assetInput.isEmpty) continue;
55+
if (assetInput.endsWith("/")) assetInput += "*";
56+
await for (var assetId in buildStep.findAssets(Glob(assetInput))) {
57+
assets.add(assetId.path);
58+
}
59+
}
60+
}
61+
62+
final pubspecAsset =
63+
await buildStep.findAssets(Glob(config.pubspecFile.path)).single;
64+
65+
final pubspecDigest = await buildStep.digest(pubspecAsset);
66+
67+
return _FlutterGenBuilderState(pubspecDigest, colors, assets);
68+
}
69+
}
70+
71+
class _FlutterGenBuilderState {
72+
final Digest pubspecDigest;
73+
final HashMap<String, Digest> colors;
74+
final HashSet<String> assets;
75+
76+
_FlutterGenBuilderState(this.pubspecDigest, this.colors, this.assets);
77+
78+
bool equals(_FlutterGenBuilderState state) {
79+
return pubspecDigest == state.pubspecDigest &&
80+
const MapEquality().equals(colors, state.colors) &&
81+
const SetEquality().equals(assets, state.assets);
82+
}
83+
}
Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,7 @@
1-
import 'dart:io';
2-
31
import 'package:build/build.dart';
4-
import 'package:flutter_gen_core/flutter_generator.dart';
52

6-
Builder build(BuilderOptions options) {
7-
Future(() async {
8-
await FlutterGenerator(File('pubspec.yaml')).build();
9-
});
10-
return EmptyBuilder();
11-
}
3+
import 'flutter_gen_builder.dart';
124

13-
class EmptyBuilder extends Builder {
14-
@override
15-
Future<void> build(BuildStep buildStep) async {}
16-
17-
@override
18-
Map<String, List<String>> get buildExtensions => {};
5+
Builder build(BuilderOptions options) {
6+
return FlutterGenBuilder();
197
}

packages/runner/pubspec.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ environment:
1313
dependencies:
1414
flutter_gen_core: ^4.1.6
1515
build: '>=2.0.0 <3.0.0'
16+
collection: ^1.15.0
17+
crypto: ^3.0.2
18+
glob: ^2.0.2
1619

1720
dev_dependencies:
1821
flutter_lints: ^2.0.1
1922
build_test: '>=2.0.0 <3.0.0'
23+
flutter_lints: '>=1.0.4 <2.0.0'

0 commit comments

Comments
 (0)