| // 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/common.dart'; |
| import '../../base/file_system.dart'; |
| import '../../base/project_migrator.dart'; |
| import '../../reporting/reporting.dart'; |
| import '../../xcode_project.dart'; |
| |
| // Remove the linking and embedding logic from the Xcode project to give the tool more control over these. |
| class RemoveMacOSFrameworkLinkAndEmbeddingMigration extends ProjectMigrator { |
| RemoveMacOSFrameworkLinkAndEmbeddingMigration( |
| MacOSProject project, |
| super.logger, |
| Usage usage, |
| ) : _xcodeProjectInfoFile = project.xcodeProjectInfoFile, |
| _usage = usage; |
| |
| final File _xcodeProjectInfoFile; |
| final Usage _usage; |
| |
| @override |
| bool migrate() { |
| if (!_xcodeProjectInfoFile.existsSync()) { |
| logger.printTrace( |
| 'Xcode project not found, skipping framework link and embedding migration'); |
| return true; |
| } |
| |
| processFileLines(_xcodeProjectInfoFile); |
| |
| return true; |
| } |
| |
| @override |
| String? migrateLine(String line) { |
| // App.framework Frameworks reference. |
| // isa = PBXFrameworksBuildPhase; |
| // files = ( |
| // D73912F022F37F9E000D13A0 /* App.framework in Frameworks */, |
| if (line.contains('D73912F022F37F9E000D13A0')) { |
| return null; |
| } |
| |
| // App.framework Embed Framework reference (build phase to embed framework). |
| // D73912F222F3801D000D13A0 /* App.framework in Bundle Framework */, |
| if (line.contains('D73912F222F3801D000D13A0')) { |
| return null; |
| } |
| |
| // App.framework project file reference (seen in Xcode navigator pane). |
| // isa = PBXGroup; |
| // children = ( |
| // D73912EF22F37F9E000D13A0 /* App.framework */, |
| if (line.contains('D73912EF22F37F9E000D13A0')) { |
| return null; |
| } |
| |
| // FlutterMacOS.framework Frameworks reference. |
| // isa = PBXFrameworksBuildPhase; |
| // files = ( |
| // 33D1A10422148B71006C7A3E /* FlutterMacOS.framework in Frameworks */, |
| if (line.contains('33D1A10422148B71006C7A3E')) { |
| return null; |
| } |
| |
| // FlutterMacOS.framework Embed Framework reference (build phase to embed framework). |
| // 33D1A10522148B93006C7A3E /* FlutterMacOS.framework in Bundle Framework */, |
| if (line.contains('33D1A10522148B93006C7A3E')) { |
| return null; |
| } |
| |
| // FlutterMacOS.framework project file reference (seen in Xcode navigator pane). |
| // isa = PBXGroup; |
| // children = ( |
| // 33D1A10322148B71006C7A3E /* FlutterMacOS.framework */, |
| if (line.contains('33D1A10322148B71006C7A3E')) { |
| return null; |
| } |
| |
| // Embed frameworks in a script instead of using Xcode's link / embed build phases. |
| const String thinBinaryScript = r'/Flutter/ephemeral/.app_filename'; |
| if (line.contains(thinBinaryScript) && !line.contains(' embed')) { |
| return line.replaceFirst( |
| thinBinaryScript, r'/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed'); |
| } |
| |
| if (line.contains('/* App.framework ') || |
| line.contains('/* FlutterMacOS.framework ')) { |
| UsageEvent('macos-migration', 'remove-frameworks', |
| label: 'failure', flutterUsage: _usage) |
| .send(); |
| throwToolExit( |
| 'Your Xcode project requires migration.'); |
| } |
| |
| return line; |
| } |
| } |