mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
[SwiftPM] Update .flutter-plugin-dependencies format (#158138)
In the future, it will be possible for Swift Package Manager to be enabled on one but not all platforms (see https://github.com/flutter/flutter/issues/151567#issuecomment-2455941279). This updates the `.flutter-plugin-dependencies` file format to separate iOS's and macOS's SwiftPM enablement. For now, these platforms will always have the same value. This `.flutter-plugin-dependencies` file is read by our CocoaPods scripts to determine whether we should use CocoaPods or not to inject plugins. Part of https://github.com/flutter/flutter/issues/151567
This commit is contained in:
parent
37d80ce25f
commit
003135e2d0
@ -210,7 +210,7 @@ public class DummyPluginAClass {
|
||||
final String flutterPluginsDependenciesFileContent = flutterPluginsDependenciesFile.readAsStringSync();
|
||||
|
||||
final Map<String, dynamic> jsonContent = json.decode(flutterPluginsDependenciesFileContent) as Map<String, dynamic>;
|
||||
final bool swiftPackageManagerEnabled = jsonContent['swift_package_manager_enabled'] as bool? ?? false;
|
||||
final Map<String, dynamic>? swiftPackageManagerJson = jsonContent['swift_package_manager_enabled'] as Map<String, dynamic>?;
|
||||
|
||||
// Verify the dependencyGraph object is valid. The rest of the contents of this file are not relevant to the
|
||||
// dependency graph and are tested by unit tests.
|
||||
@ -304,6 +304,18 @@ public class DummyPluginAClass {
|
||||
return TaskResult.failure('Failed to build plugin A example iOS app');
|
||||
}
|
||||
|
||||
final bool? swiftPackageManagerEnabled = swiftPackageManagerJson?['ios'] as bool?;
|
||||
if (swiftPackageManagerEnabled == null) {
|
||||
return TaskResult.failure(
|
||||
'${flutterPluginsDependenciesFile.path} is missing the '
|
||||
'"swift_package_manager_enabled" > "ios" property.\n'
|
||||
'\n'
|
||||
'.flutter_plugin_dependencies content:\n'
|
||||
'\n'
|
||||
'$flutterPluginsDependenciesFileContent',
|
||||
);
|
||||
}
|
||||
|
||||
if (swiftPackageManagerEnabled) {
|
||||
// Check plugins are built statically if using SwiftPM.
|
||||
final String executable = path.join(appBundle.path, 'Runner');
|
||||
|
@ -304,7 +304,7 @@ def flutter_install_plugin_pods(application_path = nil, relative_symlink_dir, pl
|
||||
plugins_file = File.join(application_path, '..', '.flutter-plugins-dependencies')
|
||||
dependencies_hash = flutter_parse_plugins_file(plugins_file)
|
||||
plugin_pods = flutter_get_plugins_list(dependencies_hash, platform)
|
||||
swift_package_manager_enabled = flutter_get_swift_package_manager_enabled(dependencies_hash)
|
||||
swift_package_manager_enabled = flutter_get_swift_package_manager_enabled(dependencies_hash, platform)
|
||||
|
||||
plugin_pods.each do |plugin_hash|
|
||||
plugin_name = plugin_hash['name']
|
||||
@ -353,10 +353,12 @@ def flutter_get_plugins_list(dependencies_hash, platform)
|
||||
dependencies_hash['plugins'][platform] || []
|
||||
end
|
||||
|
||||
def flutter_get_swift_package_manager_enabled(dependencies_hash)
|
||||
def flutter_get_swift_package_manager_enabled(dependencies_hash, platform)
|
||||
return false unless dependencies_hash.any?
|
||||
return false unless dependencies_hash.has_key?('swift_package_manager_enabled')
|
||||
dependencies_hash['swift_package_manager_enabled'] == true
|
||||
return false unless dependencies_hash['swift_package_manager_enabled'].has_key?(platform)
|
||||
|
||||
dependencies_hash['swift_package_manager_enabled'][platform] == true
|
||||
end
|
||||
|
||||
def flutter_relative_path_from_podfile(path)
|
||||
|
@ -214,7 +214,8 @@ const String _kFlutterPluginsSharedDarwinSource = 'shared_darwin_source';
|
||||
bool _writeFlutterPluginsList(
|
||||
FlutterProject project,
|
||||
List<Plugin> plugins, {
|
||||
bool forceCocoaPodsOnly = false,
|
||||
required bool swiftPackageManagerEnabledIos,
|
||||
required bool swiftPackageManagerEnabledMacos,
|
||||
}) {
|
||||
final File pluginsFile = project.flutterPluginsDependenciesFile;
|
||||
if (plugins.isEmpty) {
|
||||
@ -250,7 +251,11 @@ bool _writeFlutterPluginsList(
|
||||
result['dependencyGraph'] = _createPluginLegacyDependencyGraph(plugins);
|
||||
result['date_created'] = globals.systemClock.now().toString();
|
||||
result['version'] = globals.flutterVersion.frameworkVersion;
|
||||
result['swift_package_manager_enabled'] = !forceCocoaPodsOnly && project.usesSwiftPackageManager;
|
||||
|
||||
result['swift_package_manager_enabled'] = <String, bool>{
|
||||
'ios': swiftPackageManagerEnabledIos,
|
||||
'macos': swiftPackageManagerEnabledMacos,
|
||||
};
|
||||
|
||||
// Only notify if the plugins list has changed. [date_created] will always be different,
|
||||
// [version] is not relevant for this check.
|
||||
@ -1065,10 +1070,12 @@ Future<void> refreshPluginsList(
|
||||
// Write the legacy plugin files to avoid breaking existing apps.
|
||||
final bool legacyChanged = useImplicitPubspecResolution && _writeFlutterPluginsListLegacy(project, plugins);
|
||||
|
||||
final bool swiftPackageManagerEnabled = !forceCocoaPodsOnly && project.usesSwiftPackageManager;
|
||||
final bool changed = _writeFlutterPluginsList(
|
||||
project,
|
||||
plugins,
|
||||
forceCocoaPodsOnly: forceCocoaPodsOnly,
|
||||
swiftPackageManagerEnabledIos: swiftPackageManagerEnabled,
|
||||
swiftPackageManagerEnabledMacos: swiftPackageManagerEnabled,
|
||||
);
|
||||
if (changed || legacyChanged || forceCocoaPodsOnly) {
|
||||
createPluginSymlinks(project, force: true);
|
||||
|
@ -548,7 +548,15 @@ dependencies:
|
||||
expect(jsonContent['dependencyGraph'], expectedDependencyGraph);
|
||||
expect(jsonContent['date_created'], dateCreated.toString());
|
||||
expect(jsonContent['version'], '1.0.0');
|
||||
expect(jsonContent['swift_package_manager_enabled'], false);
|
||||
|
||||
final Map<String, dynamic> expectedSwiftPackageManagerEnabled = <String, bool>{
|
||||
'ios': false,
|
||||
'macos': false,
|
||||
};
|
||||
expect(
|
||||
jsonContent['swift_package_manager_enabled'],
|
||||
expectedSwiftPackageManagerEnabled,
|
||||
);
|
||||
|
||||
// Make sure tests are updated if a new object is added/removed.
|
||||
final List<String> expectedKeys = <String>[
|
||||
@ -665,7 +673,14 @@ dependencies:
|
||||
.readAsStringSync();
|
||||
final Map<String, dynamic> jsonContent = json.decode(pluginsString) as Map<String, dynamic>;
|
||||
|
||||
expect(jsonContent['swift_package_manager_enabled'], true);
|
||||
final Map<String, dynamic> expectedSwiftPackageManagerEnabled = <String, dynamic>{
|
||||
'ios': true,
|
||||
'macos': true,
|
||||
};
|
||||
expect(
|
||||
jsonContent['swift_package_manager_enabled'],
|
||||
expectedSwiftPackageManagerEnabled,
|
||||
);
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => fs,
|
||||
ProcessManager: () => FakeProcessManager.any(),
|
||||
@ -702,7 +717,14 @@ dependencies:
|
||||
.readAsStringSync();
|
||||
final Map<String, dynamic> jsonContent = json.decode(pluginsString) as Map<String, dynamic>;
|
||||
|
||||
expect(jsonContent['swift_package_manager_enabled'], false);
|
||||
final Map<String, dynamic> expectedSwiftPackageManagerEnabled = <String, dynamic>{
|
||||
'ios': false,
|
||||
'macos': false,
|
||||
};
|
||||
expect(
|
||||
jsonContent['swift_package_manager_enabled'],
|
||||
expectedSwiftPackageManagerEnabled,
|
||||
);
|
||||
}, overrides: <Type, Generator>{
|
||||
FileSystem: () => fs,
|
||||
ProcessManager: () => FakeProcessManager.any(),
|
||||
|
@ -2,6 +2,8 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:file_testing/file_testing.dart';
|
||||
import 'package:flutter_tools/src/base/error_handling_io.dart';
|
||||
import 'package:flutter_tools/src/base/file_system.dart';
|
||||
@ -553,14 +555,14 @@ void main() {
|
||||
.childFile('.flutter-plugins-dependencies');
|
||||
|
||||
expect(flutterPluginsDependenciesFile, exists);
|
||||
expect(
|
||||
flutterPluginsDependenciesFile.readAsStringSync(),
|
||||
isNot(contains('"swift_package_manager_enabled":true')),
|
||||
);
|
||||
expect(
|
||||
flutterPluginsDependenciesFile.readAsStringSync(),
|
||||
contains('"swift_package_manager_enabled":false'),
|
||||
);
|
||||
|
||||
final String dependenciesString = flutterPluginsDependenciesFile.readAsStringSync();
|
||||
final Map<String, dynamic>? dependenciesJson = json.decode(dependenciesString) as Map<String, dynamic>?;
|
||||
final Map<String, dynamic>? swiftPackageManagerEnabled =
|
||||
dependenciesJson?['swift_package_manager_enabled'] as Map<String, dynamic>?;
|
||||
final bool? swiftPackageManagerEnabledIos = swiftPackageManagerEnabled?['ios'] as bool?;
|
||||
|
||||
expect(swiftPackageManagerEnabledIos, isFalse);
|
||||
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
||||
|
||||
test("Generated Swift package uses iOS's project minimum deployment", () async {
|
||||
|
Loading…
Reference in New Issue
Block a user