mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Use assemble build system directly for build ios-framework (#60041)
This commit is contained in:
parent
6a2bc2617e
commit
d82ef3517c
@ -4,7 +4,6 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import '../bundle.dart';
|
||||
import '../commands/build_linux.dart';
|
||||
import '../commands/build_macos.dart';
|
||||
import '../commands/build_windows.dart';
|
||||
@ -29,7 +28,6 @@ class BuildCommand extends FlutterCommand {
|
||||
addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp));
|
||||
addSubcommand(BuildIOSFrameworkCommand(
|
||||
buildSystem: globals.buildSystem,
|
||||
bundleBuilder: BundleBuilder(),
|
||||
));
|
||||
addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
|
||||
addSubcommand(BuildWebCommand(verboseHelp: verboseHelp));
|
||||
|
@ -19,12 +19,10 @@ import '../build_system/build_system.dart';
|
||||
import '../build_system/targets/common.dart';
|
||||
import '../build_system/targets/icon_tree_shaker.dart';
|
||||
import '../build_system/targets/ios.dart';
|
||||
import '../bundle.dart';
|
||||
import '../cache.dart';
|
||||
import '../convert.dart';
|
||||
import '../globals.dart' as globals;
|
||||
import '../macos/cocoapod_utils.dart';
|
||||
import '../macos/xcode.dart';
|
||||
import '../plugins.dart';
|
||||
import '../project.dart';
|
||||
import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult;
|
||||
@ -38,13 +36,11 @@ import 'build.dart';
|
||||
class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
BuildIOSFrameworkCommand({
|
||||
FlutterVersion flutterVersion, // Instantiating FlutterVersion kicks off networking, so delay until it's needed, but allow test injection.
|
||||
@required BundleBuilder bundleBuilder,
|
||||
@required BuildSystem buildSystem,
|
||||
Cache cache,
|
||||
Platform platform
|
||||
}) : _flutterVersion = flutterVersion,
|
||||
_buildSystem = buildSystem,
|
||||
_bundleBuilder = bundleBuilder,
|
||||
_injectedCache = cache,
|
||||
_injectedPlatform = platform {
|
||||
addTreeShakeIconsFlag();
|
||||
@ -98,7 +94,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
);
|
||||
}
|
||||
|
||||
final BundleBuilder _bundleBuilder;
|
||||
final BuildSystem _buildSystem;
|
||||
BuildSystem get buildSystem => _buildSystem ?? globals.buildSystem;
|
||||
|
||||
@ -188,8 +183,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
if (modeDirectory.existsSync()) {
|
||||
modeDirectory.deleteSync(recursive: true);
|
||||
}
|
||||
final Directory iPhoneBuildOutput = modeDirectory.childDirectory('iphoneos');
|
||||
final Directory simulatorBuildOutput = modeDirectory.childDirectory('iphonesimulator');
|
||||
|
||||
if (boolArg('cocoapods')) {
|
||||
// FlutterVersion.instance kicks off git processing which can sometimes fail, so don't try it until needed.
|
||||
@ -201,10 +194,12 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
|
||||
}
|
||||
|
||||
// Build aot, create module.framework and copy.
|
||||
await _produceAppFramework(buildInfo, iPhoneBuildOutput, simulatorBuildOutput, modeDirectory);
|
||||
await _produceAppFramework(buildInfo, modeDirectory);
|
||||
|
||||
// Build and copy plugins.
|
||||
await processPodsIfNeeded(_project.ios, getIosBuildDirectory(), buildInfo.mode);
|
||||
final Directory iPhoneBuildOutput = modeDirectory.childDirectory('iphoneos');
|
||||
final Directory simulatorBuildOutput = modeDirectory.childDirectory('iphonesimulator');
|
||||
if (hasPlugins(_project)) {
|
||||
await _producePlugins(buildInfo.mode, xcodeBuildConfiguration, iPhoneBuildOutput, simulatorBuildOutput, modeDirectory, outputDirectory);
|
||||
}
|
||||
@ -345,100 +340,26 @@ end
|
||||
await _produceXCFramework(buildInfo, fatFlutterFrameworkCopy);
|
||||
}
|
||||
|
||||
Future<void> _produceAppFramework(BuildInfo buildInfo, Directory iPhoneBuildOutput, Directory simulatorBuildOutput, Directory modeDirectory) async {
|
||||
Future<void> _produceAppFramework(BuildInfo buildInfo, Directory modeDirectory) async {
|
||||
const String appFrameworkName = 'App.framework';
|
||||
final Directory destinationAppFrameworkDirectory = modeDirectory.childDirectory(appFrameworkName);
|
||||
|
||||
if (buildInfo.mode == BuildMode.debug) {
|
||||
final Status status = globals.logger.startProgress(' ├─Adding placeholder App.framework for debug...', timeout: timeoutConfiguration.fastOperation);
|
||||
try {
|
||||
destinationAppFrameworkDirectory.createSync(recursive: true);
|
||||
await _produceStubAppFrameworkIfNeeded(buildInfo, iPhoneBuildOutput, simulatorBuildOutput, destinationAppFrameworkDirectory);
|
||||
} finally {
|
||||
status.stop();
|
||||
}
|
||||
} else {
|
||||
await _produceAotAppFrameworkIfNeeded(buildInfo, modeDirectory);
|
||||
}
|
||||
|
||||
final File sourceInfoPlist = _project.ios.hostAppRoot.childDirectory('Flutter').childFile('AppFrameworkInfo.plist');
|
||||
final File destinationInfoPlist = destinationAppFrameworkDirectory.childFile('Info.plist')..createSync(recursive: true);
|
||||
|
||||
destinationInfoPlist.writeAsBytesSync(sourceInfoPlist.readAsBytesSync());
|
||||
|
||||
final Status status = globals.logger.startProgress(
|
||||
' ├─Assembling Flutter resources for App.framework...', timeout: timeoutConfiguration.slowOperation);
|
||||
try {
|
||||
if (buildInfo.mode == BuildMode.debug) {
|
||||
await _bundleBuilder.build(
|
||||
platform: TargetPlatform.ios,
|
||||
buildInfo: buildInfo,
|
||||
// Relative paths show noise in the compiler https://github.com/dart-lang/sdk/issues/37978.
|
||||
mainPath: globals.fs.path.absolute(targetFile),
|
||||
assetDirPath: destinationAppFrameworkDirectory.childDirectory('flutter_assets').path,
|
||||
precompiledSnapshot: buildInfo.mode != BuildMode.debug,
|
||||
treeShakeIcons: buildInfo.treeShakeIcons,
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
status.stop();
|
||||
}
|
||||
await _produceXCFramework(buildInfo, destinationAppFrameworkDirectory);
|
||||
}
|
||||
|
||||
Future<void> _produceStubAppFrameworkIfNeeded(BuildInfo buildInfo, Directory iPhoneBuildOutput, Directory simulatorBuildOutput, Directory destinationAppFrameworkDirectory) async {
|
||||
if (buildInfo.mode != BuildMode.debug) {
|
||||
return;
|
||||
}
|
||||
const String appFrameworkName = 'App.framework';
|
||||
const String binaryName = 'App';
|
||||
|
||||
final Directory iPhoneAppFrameworkDirectory = iPhoneBuildOutput.childDirectory(appFrameworkName);
|
||||
final File iPhoneAppFrameworkFile = iPhoneAppFrameworkDirectory.childFile(binaryName);
|
||||
await createStubAppFramework(iPhoneAppFrameworkFile, SdkType.iPhone);
|
||||
|
||||
final Directory simulatorAppFrameworkDirectory = simulatorBuildOutput.childDirectory(appFrameworkName);
|
||||
final File simulatorAppFrameworkFile = simulatorAppFrameworkDirectory.childFile(binaryName);
|
||||
await createStubAppFramework(simulatorAppFrameworkFile, SdkType.iPhoneSimulator);
|
||||
|
||||
final List<String> lipoCommand = <String>[
|
||||
'xcrun',
|
||||
'lipo',
|
||||
'-create',
|
||||
iPhoneAppFrameworkFile.path,
|
||||
simulatorAppFrameworkFile.path,
|
||||
'-output',
|
||||
destinationAppFrameworkDirectory.childFile(binaryName).path
|
||||
];
|
||||
|
||||
final RunResult lipoResult = await processUtils.run(
|
||||
lipoCommand,
|
||||
allowReentrantFlutter: false,
|
||||
);
|
||||
|
||||
if (lipoResult.exitCode != 0) {
|
||||
throwToolExit('Unable to create compiled dart universal framework: ${lipoResult.stderr}');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _produceAotAppFrameworkIfNeeded(
|
||||
BuildInfo buildInfo,
|
||||
Directory destinationDirectory,
|
||||
) async {
|
||||
if (buildInfo.mode == BuildMode.debug) {
|
||||
return;
|
||||
}
|
||||
final Status status = globals.logger.startProgress(
|
||||
' ├─Building Dart AOT for App.framework...',
|
||||
' ├─Building App.framework...',
|
||||
timeout: timeoutConfiguration.slowOperation,
|
||||
);
|
||||
try {
|
||||
final Target target = buildInfo.isRelease
|
||||
? const ReleaseIosApplicationBundle()
|
||||
: const ProfileIosApplicationBundle();
|
||||
Target target;
|
||||
if (buildInfo.isDebug) {
|
||||
target = const DebugIosApplicationBundle();
|
||||
} else if (buildInfo.isProfile) {
|
||||
target = const ProfileIosApplicationBundle();
|
||||
} else {
|
||||
target = const ReleaseIosApplicationBundle();
|
||||
}
|
||||
|
||||
final Environment environment = Environment(
|
||||
projectDir: globals.fs.currentDirectory,
|
||||
outputDir: destinationDirectory,
|
||||
outputDir: modeDirectory,
|
||||
buildDir: _project.dartTool.childDirectory('flutter_build'),
|
||||
cacheDir: null,
|
||||
flutterRootDir: globals.fs.directory(Cache.flutterRoot),
|
||||
@ -469,11 +390,14 @@ end
|
||||
for (final ExceptionMeasurement measurement in result.exceptions.values) {
|
||||
globals.printError(measurement.exception.toString());
|
||||
}
|
||||
throwToolExit('The aot build failed.');
|
||||
throwToolExit('The App.framework build failed.');
|
||||
}
|
||||
} finally {
|
||||
status.stop();
|
||||
}
|
||||
|
||||
final Directory destinationAppFrameworkDirectory = modeDirectory.childDirectory(appFrameworkName);
|
||||
await _produceXCFramework(buildInfo, destinationAppFrameworkDirectory);
|
||||
}
|
||||
|
||||
Future<void> _producePlugins(
|
||||
|
@ -9,7 +9,6 @@ import 'package:flutter_tools/src/base/file_system.dart';
|
||||
import 'package:flutter_tools/src/base/platform.dart';
|
||||
import 'package:flutter_tools/src/build_info.dart';
|
||||
import 'package:flutter_tools/src/build_system/build_system.dart';
|
||||
import 'package:flutter_tools/src/bundle.dart';
|
||||
import 'package:flutter_tools/src/cache.dart';
|
||||
import 'package:flutter_tools/src/commands/build_ios_framework.dart';
|
||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||
@ -65,7 +64,6 @@ void main() {
|
||||
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
@ -90,7 +88,6 @@ void main() {
|
||||
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
@ -112,7 +109,6 @@ void main() {
|
||||
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
@ -149,11 +145,10 @@ void main() {
|
||||
|
||||
testUsingContext('created when forced', () async {
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
buildSystem: MockBuildSystem(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache,
|
||||
);
|
||||
command.produceFlutterPodspec(BuildMode.debug, outputDirectory, force: true);
|
||||
|
||||
@ -172,11 +167,10 @@ void main() {
|
||||
|
||||
testUsingContext('contains license and version', () async {
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
buildSystem: MockBuildSystem(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache,
|
||||
);
|
||||
command.produceFlutterPodspec(BuildMode.debug, outputDirectory);
|
||||
|
||||
@ -192,11 +186,10 @@ void main() {
|
||||
|
||||
testUsingContext('debug URL', () async {
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
buildSystem: MockBuildSystem(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache,
|
||||
);
|
||||
command.produceFlutterPodspec(BuildMode.debug, outputDirectory);
|
||||
|
||||
@ -210,11 +203,10 @@ void main() {
|
||||
|
||||
testUsingContext('profile URL', () async {
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
buildSystem: MockBuildSystem(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache,
|
||||
);
|
||||
command.produceFlutterPodspec(BuildMode.profile, outputDirectory);
|
||||
|
||||
@ -228,11 +220,10 @@ void main() {
|
||||
|
||||
testUsingContext('release URL', () async {
|
||||
final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand(
|
||||
buildSystem: MockBuildSystem(),
|
||||
bundleBuilder: MockBundleBuilder(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache
|
||||
buildSystem: MockBuildSystem(),
|
||||
platform: fakePlatform,
|
||||
flutterVersion: mockFlutterVersion,
|
||||
cache: mockCache,
|
||||
);
|
||||
command.produceFlutterPodspec(BuildMode.release, outputDirectory);
|
||||
|
||||
@ -253,4 +244,3 @@ class MockFlutterVersion extends Mock implements FlutterVersion {}
|
||||
class MockGitTagVersion extends Mock implements GitTagVersion {}
|
||||
class MockCache extends Mock implements Cache {}
|
||||
class MockBuildSystem extends Mock implements BuildSystem {}
|
||||
class MockBundleBuilder extends Mock implements BundleBuilder {}
|
||||
|
Loading…
Reference in New Issue
Block a user