From 28db5a0faef116cdad40efcb996d1118f32e828a Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 6 Jan 2021 13:54:53 -0800 Subject: [PATCH] Build iOS apps using Swift Packages (#72761) --- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../ios_app_with_extensions/ios/Podfile | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 5 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 5 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../lib/src/base/project_migrator.dart | 16 ++- packages/flutter_tools/lib/src/ios/mac.dart | 2 + .../project_build_location_migration.dart | 49 ++++++++ packages/flutter_tools/lib/src/project.dart | 5 + .../contents.xcworkspacedata | 2 +- .../contents.xcworkspacedata | 2 +- .../ios/ios_project_migration_test.dart | 114 +++++++++++++----- 33 files changed, 183 insertions(+), 65 deletions(-) create mode 100644 packages/flutter_tools/lib/src/ios/migrations/project_build_location_migration.dart diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/benchmarks/microbenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/microbenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/benchmarks/microbenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/benchmarks/microbenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/benchmarks/platform_views_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/platform_views_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/benchmarks/platform_views_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/benchmarks/platform_views_layout/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/ios_app_with_extensions/ios/Podfile b/dev/integration_tests/ios_app_with_extensions/ios/Podfile index a5fb528244f..6b707b6e23e 100644 --- a/dev/integration_tests/ios_app_with_extensions/ios/Podfile +++ b/dev/integration_tests/ios_app_with_extensions/ios/Podfile @@ -39,7 +39,7 @@ target 'watch Extension' do use_frameworks! use_modular_headers! - pod 'EFQRCode/watchOS', '5.1.6' + pod 'EFQRCode', '6.0' end post_install do |installer| diff --git a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 21a3cc14c74..919434a6254 100644 --- a/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,9 +2,6 @@ - - + location = "self:"> diff --git a/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 21a3cc14c74..919434a6254 100644 --- a/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,9 +2,6 @@ - - + location = "self:"> diff --git a/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/packages/flutter_tools/lib/src/base/project_migrator.dart b/packages/flutter_tools/lib/src/base/project_migrator.dart index 6b666dd43f8..1ba453f44ec 100644 --- a/packages/flutter_tools/lib/src/base/project_migrator.dart +++ b/packages/flutter_tools/lib/src/base/project_migrator.dart @@ -26,6 +26,13 @@ abstract class ProjectMigrator { } @protected + String migrateFileContents(String fileContents) { + return fileContents; + } + + @protected + /// Calls [migrateLine] per line, then [migrateFileContents] + /// including the line migrations. void processFileLines(File file) { final List lines = file.readAsLinesSync(); @@ -51,9 +58,16 @@ abstract class ProjectMigrator { newProjectContents.writeln(newProjectLine); } + final String projectContentsWithMigratedLines = newProjectContents.toString(); + final String projectContentsWithMigratedContents = migrateFileContents(projectContentsWithMigratedLines); + if (projectContentsWithMigratedLines != projectContentsWithMigratedContents) { + logger.printTrace('Migrating $basename contents'); + migrationRequired = true; + } + if (migrationRequired) { logger.printStatus('Upgrading $basename'); - file.writeAsStringSync(newProjectContents.toString()); + file.writeAsStringSync(projectContentsWithMigratedContents); } } } diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 5ce33fb1d3a..2c804097ced 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -25,6 +25,7 @@ import '../reporting/reporting.dart'; import 'code_signing.dart'; import 'devices.dart'; import 'migrations/project_base_configuration_migration.dart'; +import 'migrations/project_build_location_migration.dart'; import 'migrations/remove_framework_link_and_embedding_migration.dart'; import 'migrations/xcode_build_system_migration.dart'; import 'xcodeproj.dart'; @@ -106,6 +107,7 @@ Future buildXcodeProject({ RemoveFrameworkLinkAndEmbeddingMigration(app.project, globals.logger, globals.xcode, globals.flutterUsage), XcodeBuildSystemMigration(app.project, globals.logger), ProjectBaseConfigurationMigration(app.project, globals.logger), + ProjectBuildLocationMigration(app.project, globals.logger), ]; final ProjectMigration migration = ProjectMigration(migrators); diff --git a/packages/flutter_tools/lib/src/ios/migrations/project_build_location_migration.dart b/packages/flutter_tools/lib/src/ios/migrations/project_build_location_migration.dart new file mode 100644 index 00000000000..e0bed32027b --- /dev/null +++ b/packages/flutter_tools/lib/src/ios/migrations/project_build_location_migration.dart @@ -0,0 +1,49 @@ +// 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 '../../base/file_system.dart'; +import '../../base/logger.dart'; +import '../../base/project_migrator.dart'; +import '../../project.dart'; + +// Update the xcodeproj build location. Legacy build location does not work with Swift Packages. +class ProjectBuildLocationMigration extends ProjectMigrator { + ProjectBuildLocationMigration( + IosProject project, + Logger logger, + ) : _xcodeProjectWorkspaceData = project.xcodeProjectWorkspaceData, + super(logger); + + final File _xcodeProjectWorkspaceData; + + @override + bool migrate() { + if (!_xcodeProjectWorkspaceData.existsSync()) { + logger.printTrace('Xcode project workspace data not found, skipping build location migration.'); + return true; + } + + processFileLines(_xcodeProjectWorkspaceData); + return true; + } + + @override + String migrateLine(String line) { + const String legacyBuildLocation = 'location = "group:Runner.xcodeproj"'; + const String defaultBuildLocation = 'location = "self:"'; + + return line.replaceAll(legacyBuildLocation, defaultBuildLocation); + } + + @override + String migrateFileContents(String fileContents) { + const String podLocation = ''' + + +'''; + + return fileContents.replaceAll(podLocation, ''); + } +} diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 26df37dd982..e400365d3b8 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -446,6 +446,11 @@ class IosProject extends FlutterProjectPlatform implements XcodeBasedProject { @override File get xcodeProjectInfoFile => xcodeProject.childFile('project.pbxproj'); + File get xcodeProjectWorkspaceData => + xcodeProject + .childDirectory('project.xcworkspace') + .childFile('contents.xcworkspacedata'); + @override Directory get xcodeWorkspace => hostAppRoot.childDirectory('$_hostAppProjectName.xcworkspace'); diff --git a/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata index 1d526a16ed0..919434a6254 100644 --- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata +++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart index f1f59aba67e..4be588b2cdf 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart @@ -5,10 +5,9 @@ import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/logger.dart'; -import 'package:flutter_tools/src/base/platform.dart'; -import 'package:flutter_tools/src/base/terminal.dart'; import 'package:flutter_tools/src/base/project_migrator.dart'; import 'package:flutter_tools/src/ios/migrations/project_base_configuration_migration.dart'; +import 'package:flutter_tools/src/ios/migrations/project_build_location_migration.dart'; import 'package:flutter_tools/src/ios/migrations/remove_framework_link_and_embedding_migration.dart'; import 'package:flutter_tools/src/ios/migrations/xcode_build_system_migration.dart'; import 'package:flutter_tools/src/macos/xcode.dart'; @@ -49,15 +48,7 @@ void main () { memoryFileSystem = MemoryFileSystem.test(); mockXcode = MockXcode(); xcodeProjectInfoFile = memoryFileSystem.file('project.pbxproj'); - - testLogger = BufferLogger( - terminal: AnsiTerminal( - stdio: null, - platform: const LocalPlatform(), - ), - outputPreferences: OutputPreferences.test(), - ); - + testLogger = BufferLogger.test(); mockIosProject = MockIosProject(); when(mockIosProject.xcodeProjectInfoFile).thenReturn(xcodeProjectInfoFile); }); @@ -267,15 +258,7 @@ keep this 2 setUp(() { memoryFileSystem = MemoryFileSystem.test(); xcodeWorkspaceSharedSettings = memoryFileSystem.file('WorkspaceSettings.xcsettings'); - - testLogger = BufferLogger( - terminal: AnsiTerminal( - stdio: null, - platform: const LocalPlatform(), - ), - outputPreferences: OutputPreferences.test(), - ); - + testLogger = BufferLogger.test(); mockIosProject = MockIosProject(); when(mockIosProject.xcodeWorkspaceSharedSettings).thenReturn(xcodeWorkspaceSharedSettings); }); @@ -338,6 +321,85 @@ keep this 2 }); }); + group('Xcode default build location', () { + MemoryFileSystem memoryFileSystem; + BufferLogger testLogger; + MockIosProject mockIosProject; + File xcodeProjectWorkspaceData; + + setUp(() { + memoryFileSystem = MemoryFileSystem(); + xcodeProjectWorkspaceData = memoryFileSystem.file('contents.xcworkspacedata'); + testLogger = BufferLogger.test(); + mockIosProject = MockIosProject(); + when(mockIosProject.xcodeProjectWorkspaceData).thenReturn(xcodeProjectWorkspaceData); + }); + + testWithoutContext('skipped if files are missing', () { + final ProjectBuildLocationMigration iosProjectMigration = ProjectBuildLocationMigration( + mockIosProject, + testLogger, + ); + expect(iosProjectMigration.migrate(), isTrue); + expect(xcodeProjectWorkspaceData.existsSync(), isFalse); + + expect(testLogger.traceText, contains('Xcode project workspace data not found, skipping build location migration.')); + expect(testLogger.statusText, isEmpty); + }); + + testWithoutContext('skipped if nothing to upgrade', () { + const String contents = ''' + + + + + '''; + xcodeProjectWorkspaceData.writeAsStringSync(contents); + + final ProjectBuildLocationMigration iosProjectMigration = ProjectBuildLocationMigration( + mockIosProject, + testLogger, + ); + expect(iosProjectMigration.migrate(), isTrue); + expect(xcodeProjectWorkspaceData.existsSync(), isTrue); + expect(testLogger.statusText, isEmpty); + }); + + testWithoutContext('Xcode project is migrated', () { + const String contents = ''' + + + + + + + +'''; + xcodeProjectWorkspaceData.writeAsStringSync(contents); + + final ProjectBuildLocationMigration iosProjectMigration = ProjectBuildLocationMigration( + mockIosProject, + testLogger, + ); + expect(iosProjectMigration.migrate(), isTrue); + expect(xcodeProjectWorkspaceData.readAsStringSync(), ''' + + + + + +'''); + expect(testLogger.statusText, contains('Upgrading contents.xcworkspacedata')); + }); + }); + group('remove Runner project base configuration', () { MemoryFileSystem memoryFileSystem; BufferLogger testLogger; @@ -345,17 +407,9 @@ keep this 2 File xcodeProjectInfoFile; setUp(() { - memoryFileSystem = MemoryFileSystem.test(); + memoryFileSystem = MemoryFileSystem(); xcodeProjectInfoFile = memoryFileSystem.file('project.pbxproj'); - - testLogger = BufferLogger( - terminal: AnsiTerminal( - stdio: null, - platform: const LocalPlatform(), - ), - outputPreferences: OutputPreferences.test(), - ); - + testLogger = BufferLogger.test(); mockIosProject = MockIosProject(); when(mockIosProject.xcodeProjectInfoFile).thenReturn(xcodeProjectInfoFile); });