Skip to content

Commit d29f6bd

Browse files
authored
✨ Support build.yaml to configure (#555)
## What does this change? Read config build.yaml and replacement configure after default, pubspec.yaml. Priority of configuration file. build.yaml -> pubspec.yaml -> default_config Fixes #114 🎯 ## Type of change - [x] New feature (non-breaking change which adds functionality) - [x] This change requires a documentation update
1 parent cf7b2a7 commit d29f6bd

File tree

10 files changed

+574
-23
lines changed

10 files changed

+574
-23
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,24 @@ flutter:
169169
style: italic
170170
```
171171

172+
### build.yaml
173+
174+
You can also configure generate options in the `build.yaml`, it will be read before the `pubspec.yaml` if it exists.
175+
176+
177+
```yaml
178+
# build.yaml
179+
# ...
180+
181+
targets:
182+
$default:
183+
builders:
184+
flutter_gen:
185+
options:
186+
output: lib/build_gen/ # Optional (default: lib/gen/)
187+
line_length: 120 # Optional (default: 80)
188+
```
189+
172190
## Available Parsers
173191

174192
### Assets

packages/command/bin/flutter_gen_command.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ void main(List<String> args) {
1414
defaultsTo: 'pubspec.yaml',
1515
);
1616

17+
parser.addOption(
18+
'build',
19+
abbr: 'b',
20+
help: 'Set the path of build.yaml.',
21+
defaultsTo: 'build.yaml',
22+
);
23+
1724
parser.addFlag(
1825
'help',
1926
abbr: 'h',
@@ -45,5 +52,10 @@ void main(List<String> args) {
4552
}
4653

4754
final pubspecPath = safeCast<String>(results['config']);
48-
FlutterGenerator(File(pubspecPath!).absolute).build();
55+
final pubspecFile = File(pubspecPath!).absolute;
56+
57+
final buildPath = safeCast<String>(results['build']);
58+
final buildFile = File(buildPath!).absolute;
59+
60+
FlutterGenerator(pubspecFile, buildFile: buildFile).build();
4961
}

packages/core/lib/flutter_generator.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,20 @@ import 'package:path/path.dart';
1111
class FlutterGenerator {
1212
const FlutterGenerator(
1313
this.pubspecFile, {
14+
this.buildFile,
1415
this.assetsName = 'assets.gen.dart',
1516
this.colorsName = 'colors.gen.dart',
1617
this.fontsName = 'fonts.gen.dart',
1718
});
1819

1920
final File pubspecFile;
21+
final File? buildFile;
2022
final String assetsName;
2123
final String colorsName;
2224
final String fontsName;
2325

2426
Future<void> build({Config? config, FileWriter? writer}) async {
25-
config ??= loadPubspecConfigOrNull(pubspecFile);
27+
config ??= loadPubspecConfigOrNull(pubspecFile, buildFile: buildFile);
2628
if (config == null) return;
2729

2830
final flutter = config.pubspec.flutter;

packages/core/lib/settings/config.dart

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,49 @@ class Config {
1515
final File pubspecFile;
1616
}
1717

18-
Config loadPubspecConfig(File pubspecFile) {
19-
stdout.writeln('$flutterGenVersion Loading ... '
20-
'${normalize(join(
21-
basename(pubspecFile.parent.path),
22-
basename(pubspecFile.path),
23-
))}');
24-
final content = pubspecFile.readAsStringSync();
25-
final userMap = loadYaml(content) as Map?;
18+
Config loadPubspecConfig(File pubspecFile, {File? buildFile}) {
19+
final pubspecLocaleHint = normalize(
20+
join(basename(pubspecFile.parent.path), basename(pubspecFile.path)),
21+
);
22+
final buildLocaleHint = buildFile != null && buildFile.existsSync()
23+
? join(basename(buildFile.parent.path), basename(buildFile.path))
24+
: '';
25+
26+
stdout.writeln(
27+
'$flutterGenVersion Loading ...',
28+
);
29+
2630
final defaultMap = loadYaml(configDefaultYamlContent) as Map?;
27-
final mergedMap = mergeMap([defaultMap, userMap]);
31+
32+
final pubspecContent = pubspecFile.readAsStringSync();
33+
final pubspecMap = loadYaml(pubspecContent) as Map?;
34+
35+
var mergedMap = mergeMap([defaultMap, pubspecMap]);
36+
stdout.writeln(
37+
'Reading FlutterGen options from $pubspecLocaleHint',
38+
);
39+
40+
if (buildFile != null && buildFile.existsSync()) {
41+
final buildContent = buildFile.readAsStringSync();
42+
final rawMap = loadYaml(buildContent) as Map?;
43+
final optionBuildMap = rawMap?['targets']?[r'$default']?['builders']?['flutter_gen']?['options'];
44+
45+
if (optionBuildMap != null) {
46+
final buildMap = {'flutter_gen': optionBuildMap};
47+
mergedMap = mergeMap([mergedMap, buildMap]);
48+
stdout.writeln(
49+
'Reading FlutterGen options from $buildLocaleHint',
50+
);
51+
}
52+
}
53+
2854
final pubspec = Pubspec.fromJson(mergedMap);
2955
return Config._(pubspec: pubspec, pubspecFile: pubspecFile);
3056
}
3157

32-
Config? loadPubspecConfigOrNull(File pubspecFile) {
58+
Config? loadPubspecConfigOrNull(File pubspecFile, {File? buildFile}) {
3359
try {
34-
return loadPubspecConfig(pubspecFile);
60+
return loadPubspecConfig(pubspecFile, buildFile: buildFile);
3561
} on FileSystemException catch (e) {
3662
stderr.writeln(e.message);
3763
} on InvalidSettingsException catch (e) {

packages/core/test/assets_gen_test.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,15 @@ void main() {
213213
final names = got.map((e) => e.name);
214214
expect(names.sorted(), tests.values.sorted());
215215
});
216+
217+
test('Assets on pubspec_assets.yaml and override with build_assets.yaml ', () async {
218+
const pubspec = 'test_resources/pubspec_assets.yaml';
219+
const build = 'test_resources/build_assets.yaml';
220+
const fact = 'test_resources/actual_data/build_assets.gen.dart';
221+
const generated = 'test_resources/lib/build_gen/assets.gen.dart';
222+
223+
await expectedAssetsGen(pubspec, generated, fact, build: build);
224+
});
216225
});
217226

218227
group('Test generatePackageNameForConfig', () {

packages/core/test/flutter_gen_test.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,5 +179,27 @@ void main() {
179179
expect(File('test_resources/lib/gen/$fonts').existsSync(), false);
180180
expect(File('test_resources/lib/gen/$colors').existsSync(), false);
181181
});
182+
183+
test('With build_output.yaml', () async {
184+
const pubspec = 'test_resources/pubspec_normal.yaml';
185+
const build = 'test_resources/build_output.yaml';
186+
const assets = 'build_assets.gen.dart';
187+
const colors = 'build_colors.gen.dart';
188+
const fonts = 'build_fonts.gen.dart';
189+
190+
await FlutterGenerator(
191+
File(pubspec),
192+
buildFile: File(build),
193+
assetsName: assets,
194+
colorsName: colors,
195+
fontsName: fonts,
196+
).build();
197+
expect(File('test_resources/lib/build_gen/$assets').readAsStringSync(),
198+
isNotEmpty);
199+
expect(File('test_resources/lib/build_gen/$fonts').readAsStringSync(),
200+
isNotEmpty);
201+
expect(File('test_resources/lib/build_gen/$colors').readAsStringSync(),
202+
isNotEmpty);
203+
});
182204
});
183205
}

packages/core/test/gen_test_helper.dart

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,21 @@ Future<void> clearTestResults() async {}
1414
Future<List<String>> runAssetsGen(
1515
String pubspec,
1616
String generated,
17-
String fact,
18-
) async {
17+
String fact, {
18+
String? build,
19+
}) async {
20+
final pubspecFile = File(pubspec);
21+
22+
File? buildFile;
23+
if (build != null) buildFile = File(build);
24+
1925
await FlutterGenerator(
20-
File(pubspec),
26+
pubspecFile,
27+
buildFile: buildFile,
2128
assetsName: p.basename(generated),
2229
).build();
2330

24-
final pubspecFile = File(pubspec);
25-
final config = loadPubspecConfig(pubspecFile);
31+
final config = loadPubspecConfig(pubspecFile, buildFile: buildFile);
2632
final formatter = DartFormatter(
2733
pageWidth: config.pubspec.flutterGen.lineLength,
2834
lineEnding: '\n',
@@ -42,9 +48,10 @@ Future<List<String>> runAssetsGen(
4248
Future<void> expectedAssetsGen(
4349
String pubspec,
4450
String generated,
45-
String fact,
46-
) async {
47-
final results = await runAssetsGen(pubspec, generated, fact);
51+
String fact, {
52+
String? build,
53+
}) async {
54+
final results = await runAssetsGen(pubspec, generated, fact, build: build);
4855
final actual = results.first, expected = results.last;
4956
expect(
5057
File(generated).readAsStringSync(),

0 commit comments

Comments
 (0)