blob: 4561c6374a5c8b1508de147c18a6696d0fe8b648 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart';
import '../../base/file_system.dart';
import '../../build_info.dart';
import '../../dart/package_map.dart';
import '../../flutter_plugins.dart';
import '../../project.dart';
import '../build_system.dart';
/// Generates a new `./dart_tool/flutter_build/generated_main.dart`
/// based on the current dependency map in `pubspec.lock`.
class DartPluginRegistrantTarget extends Target {
/// Construct a [DartPluginRegistrantTarget].
const DartPluginRegistrantTarget() : _project = null;
/// Construct a [DartPluginRegistrantTarget].
///
/// If `project` is unset, a [FlutterProject] based on environment is used.
@visibleForTesting
factory DartPluginRegistrantTarget.test(FlutterProject project) {
return DartPluginRegistrantTarget._(project);
}
DartPluginRegistrantTarget._(this._project);
final FlutterProject? _project;
@override
Future<void> build(Environment environment) async {
assert(environment.generateDartPluginRegistry);
final File packagesFile = environment.projectDir
.childDirectory('.dart_tool')
.childFile('package_config.json');
final PackageConfig packageConfig = await loadPackageConfigWithLogging(
packagesFile,
logger: environment.logger,
);
final String targetFile = environment.defines[kTargetFile] ??
environment.fileSystem.path.join('lib', 'main.dart');
final File mainFile = environment.fileSystem.file(targetFile);
final Uri mainFileUri = mainFile.absolute.uri;
final String mainUri = packageConfig.toPackageUri(mainFileUri)?.toString() ?? mainFileUri.toString();
final File newMainDart = environment.projectDir
.childDirectory('.dart_tool')
.childDirectory('flutter_build')
.childFile('generated_main.dart');
await generateMainDartWithPluginRegistrant(
_project ?? FlutterProject.fromDirectory(environment.projectDir),
packageConfig,
mainUri,
newMainDart,
mainFile,
throwOnPluginPubspecError: false,
);
}
@override
bool canSkip(Environment environment) {
if (!environment.generateDartPluginRegistry) {
return true;
}
final String? platformName = environment.defines[kTargetPlatform];
if (platformName == null) {
return true;
}
final TargetPlatform? targetPlatform = getTargetPlatformForName(platformName);
// TODO(egarciad): Support Android and iOS.
// https://github.com/flutter/flutter/issues/52267
return targetPlatform != TargetPlatform.darwin &&
targetPlatform != TargetPlatform.linux_x64 &&
targetPlatform != TargetPlatform.linux_arm64 &&
targetPlatform != TargetPlatform.windows_x64 &&
targetPlatform != TargetPlatform.windows_uwp_x64;
}
@override
List<Target> get dependencies => <Target>[];
@override
List<Source> get inputs => <Source>[
const Source.pattern('{PROJECT_DIR}/.dart_tool/package_config_subset'),
];
@override
String get name => 'gen_dart_plugin_registrant';
@override
List<Source> get outputs => <Source>[
const Source.pattern(
'{PROJECT_DIR}/.dart_tool/flutter_build/generated_main.dart',
optional: true,
),
];
}