diff --git a/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart b/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart index b9dfe29733..2547245958 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapod_utils.dart @@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import '../base/error_handling_io.dart'; import '../base/fingerprint.dart'; import '../build_info.dart'; import '../cache.dart'; import '../flutter_plugins.dart'; import '../globals.dart' as globals; +import '../plugins.dart'; import '../project.dart'; +import 'swift_package_manager.dart'; /// For a given build, determines whether dependencies have changed since the /// last call to processPods, then calls processPods with that information. @@ -61,8 +62,15 @@ Future processPodsIfNeeded( await globals.cocoaPods?.setupPodfile(xcodeProject); } - // Delete Swift Package Manager manifest to invalidate fingerprinter - ErrorHandlingFileSystem.deleteIfExists(xcodeProject.flutterPluginSwiftPackageManifest); + // Generate an empty Swift Package Manager manifest to invalidate fingerprinter + final SwiftPackageManager swiftPackageManager = SwiftPackageManager( + fileSystem: globals.localFileSystem, + templateRenderer: globals.templateRenderer, + ); + final SupportedPlatform platform = + xcodeProject is IosProject ? SupportedPlatform.ios : SupportedPlatform.macos; + + await swiftPackageManager.generatePluginsSwiftPackage(const [], platform, xcodeProject); } // If the Xcode project, Podfile, generated plugin Swift Package, or podhelper diff --git a/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart b/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart index 240ded035c..2c3ab180b2 100644 --- a/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart @@ -6,6 +6,7 @@ import 'dart:convert'; import 'package:file/file.dart'; import 'package:file/memory.dart'; +import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/dart/pub.dart'; @@ -239,7 +240,8 @@ void main() { setUpProject(flutterProject, fs); createFakePlugins(flutterProject, fs, ['plugin_one', 'plugin_two']); flutterProject.ios.usesSwiftPackageManager = true; - flutterProject.ios.flutterPluginSwiftPackageManifest.createSync(recursive: true); + final File generatedManifestFile = flutterProject.ios.flutterPluginSwiftPackageManifest; + generatedManifestFile.createSync(recursive: true); await processPodsIfNeeded( flutterProject.ios, @@ -254,7 +256,9 @@ void main() { 'Swift Package Manager does not yet support this command. ' 'CocoaPods will be used instead.\n', ); - expect(flutterProject.ios.flutterPluginSwiftPackageManifest.existsSync(), isFalse); + expect(generatedManifestFile, exists); + const String emptyDependencies = 'dependencies: [\n \n ],\n'; + expect(generatedManifestFile.readAsStringSync(), contains(emptyDependencies)); }, overrides: { FileSystem: () => fs, @@ -412,7 +416,9 @@ void main() { setUpProject(flutterProject, fs); createFakePlugins(flutterProject, fs, ['plugin_one', 'plugin_two']); flutterProject.macos.usesSwiftPackageManager = true; - flutterProject.macos.flutterPluginSwiftPackageManifest.createSync(recursive: true); + final File generatedManifestFile = + flutterProject.macos.flutterPluginSwiftPackageManifest; + generatedManifestFile.createSync(recursive: true); await processPodsIfNeeded( flutterProject.macos, @@ -427,7 +433,10 @@ void main() { 'Swift Package Manager does not yet support this command. ' 'CocoaPods will be used instead.\n', ); - expect(flutterProject.macos.flutterPluginSwiftPackageManifest.existsSync(), isFalse); + + expect(generatedManifestFile, exists); + const String emptyDependencies = 'dependencies: [\n \n ],\n'; + expect(generatedManifestFile.readAsStringSync(), contains(emptyDependencies)); }, overrides: { FileSystem: () => fs, @@ -517,6 +526,9 @@ class FakeMacOSProject extends Fake implements MacOSProject { @override bool usesSwiftPackageManager = false; + + @override + bool get flutterPluginSwiftPackageInProjectSettings => usesSwiftPackageManager; } class FakeIosProject extends Fake implements IosProject { @@ -555,6 +567,9 @@ class FakeIosProject extends Fake implements IosProject { @override bool usesSwiftPackageManager = false; + + @override + bool get flutterPluginSwiftPackageInProjectSettings => usesSwiftPackageManager; } class FakeAndroidProject extends Fake implements AndroidProject { diff --git a/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart b/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart index fef95beb4f..45ba3b1453 100644 --- a/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart +++ b/packages/flutter_tools/test/integration.shard/swift_package_manager_test.dart @@ -507,19 +507,21 @@ void main() { expect(fileSystem.directory(appDirectoryPath).childDirectory('.ios'), isNot(exists)); - // TODO(loic-sharma): A Swift package manifest should not be generated. - // https://github.com/flutter/flutter/issues/146957 - // expect( - // fileSystem - // .directory(appDirectoryPath) - // .childDirectory('ios') - // .childDirectory('Flutter') - // .childDirectory('ephemeral') - // .childDirectory('Packages') - // .childDirectory('FlutterGeneratedPluginSwiftPackage') - // .childFile('Package.swift'), - // isFalse, - // ); + // Verify the generated Swift Package Manager manifest file has no dependencies. + final File generatedManifestFile = fileSystem + .directory(appDirectoryPath) + .childDirectory('ios') + .childDirectory('Flutter') + .childDirectory('ephemeral') + .childDirectory('Packages') + .childDirectory('FlutterGeneratedPluginSwiftPackage') + .childFile('Package.swift'); + + expect(generatedManifestFile, exists); + + final String generatedManifest = generatedManifestFile.readAsStringSync(); + const String expected = 'dependencies: [\n \n ],\n'; + expect(generatedManifest, contains(expected)); expect( fileSystem