mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
This reverts commit aab9a76ee4
.
This commit is contained in:
parent
aab9a76ee4
commit
be2e7bb1c0
@ -17,15 +17,49 @@ Future<void> main() async {
|
||||
section('Create module project');
|
||||
|
||||
final Directory tempDir = Directory.systemTemp.createTempSync('flutter_module_test.');
|
||||
final Directory projectDir = Directory(path.join(tempDir.path, 'hello'));
|
||||
try {
|
||||
await inDirectory(tempDir, () async {
|
||||
section('Test module template');
|
||||
|
||||
final Directory moduleProjectDir =
|
||||
Directory(path.join(tempDir.path, 'hello_module'));
|
||||
await flutter(
|
||||
'create',
|
||||
options: <String>['--org', 'io.flutter.devicelab', '--template', 'module', 'hello'],
|
||||
options: <String>[
|
||||
'--org',
|
||||
'io.flutter.devicelab',
|
||||
'--template',
|
||||
'module',
|
||||
'hello_module'
|
||||
],
|
||||
);
|
||||
|
||||
await _testBuildIosFramework(moduleProjectDir, isModule: true);
|
||||
|
||||
section('Test app template');
|
||||
|
||||
final Directory projectDir =
|
||||
Directory(path.join(tempDir.path, 'hello_project'));
|
||||
await flutter(
|
||||
'create',
|
||||
options: <String>['--org', 'io.flutter.devicelab', 'hello_project'],
|
||||
);
|
||||
|
||||
await _testBuildIosFramework(projectDir);
|
||||
});
|
||||
|
||||
return TaskResult.success(null);
|
||||
} on TaskResult catch (taskResult) {
|
||||
return taskResult;
|
||||
} catch (e) {
|
||||
return TaskResult.failure(e.toString());
|
||||
} finally {
|
||||
// rmTree(tempDir);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = false}) async {
|
||||
section('Add plugins');
|
||||
|
||||
final File pubspec = File(path.join(projectDir.path, 'pubspec.yaml'));
|
||||
@ -299,6 +333,9 @@ Future<void> main() async {
|
||||
section('Check all modes have generated plugin registrant');
|
||||
|
||||
for (final String mode in <String>['Debug', 'Profile', 'Release']) {
|
||||
if (!isModule) {
|
||||
continue;
|
||||
}
|
||||
final String registrantFrameworkPath = path.join(
|
||||
outputPath,
|
||||
mode,
|
||||
@ -373,11 +410,15 @@ Future<void> main() async {
|
||||
'App.framework',
|
||||
));
|
||||
|
||||
checkDirectoryExists(path.join(
|
||||
if (Directory(path.join(
|
||||
cocoapodsOutputPath,
|
||||
mode,
|
||||
'FlutterPluginRegistrant.framework',
|
||||
));
|
||||
)).existsSync() !=
|
||||
isModule) {
|
||||
throw TaskResult.failure(
|
||||
'Unexpected FlutterPluginRegistrant.framework.');
|
||||
}
|
||||
|
||||
checkDirectoryExists(path.join(
|
||||
cocoapodsOutputPath,
|
||||
@ -392,15 +433,21 @@ Future<void> main() async {
|
||||
));
|
||||
}
|
||||
|
||||
return TaskResult.success(null);
|
||||
} on TaskResult catch (taskResult) {
|
||||
return taskResult;
|
||||
} catch (e) {
|
||||
return TaskResult.failure(e.toString());
|
||||
} finally {
|
||||
rmTree(tempDir);
|
||||
if (File(path.join(
|
||||
outputPath,
|
||||
'GeneratedPluginRegistrant.h',
|
||||
)).existsSync() ==
|
||||
isModule) {
|
||||
throw TaskResult.failure('Unexpected GeneratedPluginRegistrant.h.');
|
||||
}
|
||||
|
||||
if (File(path.join(
|
||||
outputPath,
|
||||
'GeneratedPluginRegistrant.m',
|
||||
)).existsSync() ==
|
||||
isModule) {
|
||||
throw TaskResult.failure('Unexpected GeneratedPluginRegistrant.m.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _checkFrameworkArchs(String frameworkPath, String mode) async {
|
||||
|
@ -113,7 +113,7 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
final String name = 'ios-framework';
|
||||
|
||||
@override
|
||||
final String description = 'Produces a .framework directory for a Flutter module '
|
||||
final String description = 'Produces .frameworks for a Flutter project '
|
||||
'and its plugins for integration into existing, plain Xcode projects.\n'
|
||||
'This can only be run on macOS hosts.';
|
||||
|
||||
@ -144,10 +144,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
Future<void> validateCommand() async {
|
||||
await super.validateCommand();
|
||||
_project = FlutterProject.current();
|
||||
if (!_project.isModule) {
|
||||
throwToolExit('Building frameworks for iOS is only supported from a module.');
|
||||
}
|
||||
|
||||
if (!_platform.isMacOS) {
|
||||
throwToolExit('Building frameworks for iOS is only supported on the Mac.');
|
||||
}
|
||||
@ -178,7 +174,7 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
}
|
||||
|
||||
if (!_project.ios.existsSync()) {
|
||||
throwToolExit('Module does not support iOS');
|
||||
throwToolExit('Project does not support iOS');
|
||||
}
|
||||
|
||||
final Directory outputDirectory = globals.fs.directory(globals.fs.path.absolute(globals.fs.path.normalize(outputArgument)));
|
||||
@ -233,6 +229,23 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
}
|
||||
|
||||
globals.printStatus('Frameworks written to ${outputDirectory.path}.');
|
||||
|
||||
if (!_project.isModule && hasPlugins(_project)) {
|
||||
// Apps do not generate a FlutterPluginRegistrant.framework. Users will need
|
||||
// to copy the GeneratedPluginRegistrant class to their project manually.
|
||||
final File pluginRegistrantHeader = _project.ios.pluginRegistrantHeader;
|
||||
final File pluginRegistrantImplementation =
|
||||
_project.ios.pluginRegistrantImplementation;
|
||||
pluginRegistrantHeader.copySync(
|
||||
outputDirectory.childFile(pluginRegistrantHeader.basename).path);
|
||||
pluginRegistrantImplementation.copySync(outputDirectory
|
||||
.childFile(pluginRegistrantImplementation.basename)
|
||||
.path);
|
||||
globals.printStatus(
|
||||
'\nCopy the ${globals.fs.path.basenameWithoutExtension(pluginRegistrantHeader.path)} class into your project.\n'
|
||||
'See https://flutter.dev/docs/development/add-to-app/ios/add-flutter-screen#create-a-flutterengine for more information.');
|
||||
}
|
||||
|
||||
return FlutterCommandResult.success();
|
||||
}
|
||||
|
||||
@ -459,6 +472,7 @@ end
|
||||
xcodeBuildConfiguration,
|
||||
'SYMROOT=${iPhoneBuildOutput.path}',
|
||||
'BITCODE_GENERATION_MODE=$bitcodeGenerationMode',
|
||||
'ENABLE_BITCODE=YES', // Support host apps with bitcode enabled.
|
||||
'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures.
|
||||
'BUILD_LIBRARY_FOR_DISTRIBUTION=YES',
|
||||
];
|
||||
@ -483,6 +497,7 @@ end
|
||||
'-configuration',
|
||||
xcodeBuildConfiguration,
|
||||
'SYMROOT=${simulatorBuildOutput.path}',
|
||||
'ENABLE_BITCODE=YES', // Support host apps with bitcode enabled.
|
||||
'ARCHS=x86_64',
|
||||
'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures.
|
||||
'BUILD_LIBRARY_FOR_DISTRIBUTION=YES',
|
||||
|
@ -897,36 +897,24 @@ Future<void> _writeIOSPluginRegistrant(FlutterProject project, List<Plugin> plug
|
||||
'framework': 'Flutter',
|
||||
'plugins': iosPlugins,
|
||||
};
|
||||
final String registryDirectory = project.ios.pluginRegistrantHost.path;
|
||||
if (project.isModule) {
|
||||
final String registryClassesDirectory = globals.fs.path.join(registryDirectory, 'Classes');
|
||||
final String registryDirectory = project.ios.pluginRegistrantHost.path;
|
||||
_renderTemplateToFile(
|
||||
_pluginRegistrantPodspecTemplate,
|
||||
context,
|
||||
globals.fs.path.join(registryDirectory, 'FlutterPluginRegistrant.podspec'),
|
||||
);
|
||||
_renderTemplateToFile(
|
||||
_objcPluginRegistryHeaderTemplate,
|
||||
context,
|
||||
globals.fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.h'),
|
||||
);
|
||||
_renderTemplateToFile(
|
||||
_objcPluginRegistryImplementationTemplate,
|
||||
context,
|
||||
globals.fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.m'),
|
||||
);
|
||||
} else {
|
||||
_renderTemplateToFile(
|
||||
_objcPluginRegistryHeaderTemplate,
|
||||
context,
|
||||
globals.fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.h'),
|
||||
);
|
||||
_renderTemplateToFile(
|
||||
_objcPluginRegistryImplementationTemplate,
|
||||
context,
|
||||
globals.fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.m'),
|
||||
);
|
||||
}
|
||||
_renderTemplateToFile(
|
||||
_objcPluginRegistryHeaderTemplate,
|
||||
context,
|
||||
project.ios.pluginRegistrantHeader.path,
|
||||
);
|
||||
_renderTemplateToFile(
|
||||
_objcPluginRegistryImplementationTemplate,
|
||||
context,
|
||||
project.ios.pluginRegistrantImplementation.path,
|
||||
);
|
||||
}
|
||||
|
||||
/// The relative path from a project's main CMake file to the plugin symlink
|
||||
|
@ -665,15 +665,12 @@ class IosProject extends FlutterProjectPlatform implements XcodeBasedProject {
|
||||
)
|
||||
);
|
||||
if (framework.existsSync()) {
|
||||
final Directory engineDest = ephemeralDirectory
|
||||
.childDirectory('Flutter')
|
||||
.childDirectory('engine');
|
||||
final File podspec = framework.parent.childFile('Flutter.podspec');
|
||||
globals.fsUtils.copyDirectorySync(
|
||||
framework,
|
||||
engineDest.childDirectory('Flutter.framework'),
|
||||
engineCopyDirectory.childDirectory('Flutter.framework'),
|
||||
);
|
||||
podspec.copySync(engineDest.childFile('Flutter.podspec').path);
|
||||
podspec.copySync(engineCopyDirectory.childFile('Flutter.podspec').path);
|
||||
}
|
||||
}
|
||||
|
||||
@ -704,6 +701,22 @@ class IosProject extends FlutterProjectPlatform implements XcodeBasedProject {
|
||||
: hostAppRoot.childDirectory(_hostAppProjectName);
|
||||
}
|
||||
|
||||
File get pluginRegistrantHeader {
|
||||
final Directory registryDirectory = isModule ? pluginRegistrantHost.childDirectory('Classes') : pluginRegistrantHost;
|
||||
return registryDirectory.childFile('GeneratedPluginRegistrant.h');
|
||||
}
|
||||
|
||||
File get pluginRegistrantImplementation {
|
||||
final Directory registryDirectory = isModule ? pluginRegistrantHost.childDirectory('Classes') : pluginRegistrantHost;
|
||||
return registryDirectory.childFile('GeneratedPluginRegistrant.m');
|
||||
}
|
||||
|
||||
Directory get engineCopyDirectory {
|
||||
return isModule
|
||||
? ephemeralDirectory.childDirectory('Flutter').childDirectory('engine')
|
||||
: hostAppRoot.childDirectory('Flutter');
|
||||
}
|
||||
|
||||
Future<void> _overwriteFromTemplate(String path, Directory target) async {
|
||||
final Template template = await Template.fromName(
|
||||
path,
|
||||
|
Loading…
Reference in New Issue
Block a user