diff --git a/packages/command/bin/flutter_gen_command.dart b/packages/command/bin/flutter_gen_command.dart index 5c39202bf..aa2f579b7 100644 --- a/packages/command/bin/flutter_gen_command.dart +++ b/packages/command/bin/flutter_gen_command.dart @@ -149,11 +149,6 @@ Future _runSinglePackage( }) async { await FlutterGenerator( pubspecFile, - buildFile: buildFile ?? _packageLocalBuildFile(pubspecFile), + buildFile: buildFile, ).build(); } - -File? _packageLocalBuildFile(File pubspecFile) { - final buildFile = File(p.join(pubspecFile.parent.path, 'build.yaml')); - return buildFile.existsSync() ? buildFile : null; -} diff --git a/packages/command/test/flutter_gen_command_test.dart b/packages/command/test/flutter_gen_command_test.dart index 14b4437de..de6fb32f9 100644 --- a/packages/command/test/flutter_gen_command_test.dart +++ b/packages/command/test/flutter_gen_command_test.dart @@ -196,6 +196,78 @@ targets: isFalse, ); }); + + for (final workspace in [false, true]) { + test( + 'Execute fluttergen ignores unrelated build.yaml (workspace: $workspace)', + () async { + final workspaceDir = await _copyExampleWorkspace(); + addTearDown(() => workspaceDir.deleteSync(recursive: true)); + await _deleteGeneratedDirs(workspaceDir); + + final galleryOneDir = Directory( + p.join(workspaceDir.path, 'packages', 'gallery_one'), + ); + File(p.join(galleryOneDir.path, 'build.yaml')).writeAsStringSync(r''' +targets: + $default: + builders: + unrelated_builder: + options: + enabled: true +'''); + + final process = await TestProcess.start( + 'dart', + [ + 'run', + p.join(Directory.current.path, 'bin', 'flutter_gen_command.dart'), + if (workspace) '--workspace', + '--config', + p.join( + workspace ? workspaceDir.path : galleryOneDir.path, + 'pubspec.yaml', + ), + ], + workingDirectory: workspaceDir.path, + ); + + await process.shouldExit(0); + expect(await process.stderr.rest.toList(), isEmpty); + expect( + File(p.join(galleryOneDir.path, 'lib', 'gen', 'assets.gen.dart')) + .readAsStringSync(), + contains('class GalleryOneAssets'), + ); + }); + } + + test('Execute fluttergen reports an explicit build file without options', + () async { + final workspaceDir = await _copyExampleWorkspace(); + addTearDown(() => workspaceDir.deleteSync(recursive: true)); + final buildFile = File(p.join(workspaceDir.path, 'build.yaml')) + ..writeAsStringSync('targets: {}\n'); + + final process = await TestProcess.start( + 'dart', + [ + 'run', + p.join(Directory.current.path, 'bin', 'flutter_gen_command.dart'), + '--config', + p.join(workspaceDir.path, 'packages', 'gallery_one', 'pubspec.yaml'), + '--build', + buildFile.path, + ], + workingDirectory: workspaceDir.path, + ); + + await process.shouldExit(0); + expect( + (await process.stderr.rest.toList()).join('\n'), + contains('[SEVERE]'), + ); + }); } Future _copyExampleWorkspace() async { diff --git a/packages/core/lib/settings/config.dart b/packages/core/lib/settings/config.dart index 7e1f9635d..039a79f0f 100644 --- a/packages/core/lib/settings/config.dart +++ b/packages/core/lib/settings/config.dart @@ -83,8 +83,9 @@ Config loadPubspecConfig(File pubspecFile, {File? buildFile}) { // Fallback to the build.yaml when no build file has been specified and // the default one has valid configurations. - if (buildFile == null && getBuildFileOptions(File('build.yaml')) != null) { - buildFile = File('build.yaml'); + final defaultBuildFile = File(join(pubspecFile.parent.path, 'build.yaml')); + if (buildFile == null && getBuildFileOptions(defaultBuildFile) != null) { + buildFile = defaultBuildFile; } if (buildFile != null) { diff --git a/packages/core/test/assets_gen_test.dart b/packages/core/test/assets_gen_test.dart index 38ab09125..c8f821ce2 100644 --- a/packages/core/test/assets_gen_test.dart +++ b/packages/core/test/assets_gen_test.dart @@ -215,14 +215,26 @@ void main() { test('fallback to build.yaml if valid', () async { const pubspec = 'test_resources/pubspec_assets.yaml'; - final buildFile = File('build.yaml'); - final originalBuildContent = buildFile.readAsStringSync(); + final buildFile = File('test_resources/build.yaml'); + final originalBuildContent = + buildFile.existsSync() ? buildFile.readAsStringSync() : null; + addTearDown(() { + if (originalBuildContent == null) { + buildFile.deleteSync(); + } else { + buildFile.writeAsStringSync(originalBuildContent); + } + }); + final generated = + File('test_resources/lib/build_gen/assets_assets.gen.dart'); + if (generated.existsSync()) { + generated.deleteSync(); + } buildFile.writeAsStringSync( File('test_resources/build_assets.yaml').readAsStringSync(), ); - await expectedAssetsGen(pubspec).whenComplete(() { - buildFile.writeAsStringSync(originalBuildContent); - }); + await expectedAssetsGen(pubspec); + expect(generated.existsSync(), isTrue); }); }); diff --git a/packages/core/test/config_test.dart b/packages/core/test/config_test.dart index da7dc135a..108d6f505 100644 --- a/packages/core/test/config_test.dart +++ b/packages/core/test/config_test.dart @@ -232,6 +232,31 @@ sdks: }); group('ConfigLoadInput', () { + test( + 'discovers build options beside the pubspec outside the working directory', + () { + final tempDir = Directory.systemTemp.createTempSync('flutter_gen_test'); + addTearDown(() => tempDir.deleteSync(recursive: true)); + final tempPubspec = File('${tempDir.path}/pubspec.yaml') + ..writeAsStringSync(''' +name: package_build_options_test +flutter_gen: + output: lib/gen/ +'''); + File('${tempDir.path}/build.yaml').writeAsStringSync(r''' +targets: + $default: + builders: + flutter_gen_runner: + options: + output: lib/build_gen/ +'''); + + final config = loadPubspecConfig(tempPubspec); + + expect(config.pubspec.flutterGen.output, 'lib/build_gen/'); + }); + test('ignores a missing explicit build file', () { final tempDir = Directory.systemTemp.createTempSync('flutter_gen_test'); try {