Add command to build a Swift Package for Add to App and generate FlutterPluginRegistrant#181224
Conversation
There was a problem hiding this comment.
Code Review
This pull request introduces a new command flutter build swift-package to generate Swift packages for Flutter projects and their plugins. The changes include adding a new command file, modifying existing plugin registrant functions to be more flexible, and updating the Swift package generation logic. New test cases have been added to cover the introduced functionality.
packages/flutter_tools/lib/src/commands/build_swift_package.dart
Outdated
Show resolved
Hide resolved
| @override | ||
| final description = | ||
| 'Produces Swift packages and scripts for a Flutter project ' | ||
| 'and its plugins for integration into existing, plain iOS and macOS Xcode projects.\n' |
There was a problem hiding this comment.
Maybe "non-Flutter" rather than "plain", so it's clear what that means?
| } | ||
| throwToolExit( | ||
| 'The $platformString platform is being targeted, but is not supported for this command. ' | ||
| 'Supported platforms include: ios, macos.', |
There was a problem hiding this comment.
Optional: you could make ['ios', 'macos'] a constant, and then use it for allowed above and as ${supportedPlatforms}.join(', ')} here, so that it would stay in sync, and not need the "include".
|
|
||
| @override | ||
| Future<Set<DevelopmentArtifact>> get requiredArtifacts async { | ||
| switch (_targetPlatform) { |
There was a problem hiding this comment.
Nit: new-style switch plus dot shorthand:
return switch (_targetPlatform) {
.ios => <DevelopmentArtifact>{DevelopmentArtifact.iOS},
.macos => <DevelopmentArtifact>{DevelopmentArtifact.macOS},
};| } | ||
| if (buildModes.contains('release')) { | ||
| buildInfos.add(await getBuildInfo(forcedBuildMode: BuildMode.release)); | ||
| } |
There was a problem hiding this comment.
I believe this could be
return <BuildInfo>[
if (buildModes.contains('debug'))
await getBuildInfo(forcedBuildMode: BuildMode.debug),
if (buildModes.contains('profile'))
await getBuildInfo(forcedBuildMode: BuildMode.profile),
if (buildModes.contains('release'))
await getBuildInfo(forcedBuildMode: BuildMode.release),
];| ); | ||
|
|
||
| if (outputArgument.isEmpty) { | ||
| throwToolExit('--output is required.'); |
There was a problem hiding this comment.
Can't this only happen if --output is provided, but empty? In which case we should make this say something about needing a value instead.
| final File headerFile = sourcesDirectory | ||
| .childDirectory(kPluginSwiftPackageName) | ||
| .childDirectory('include') | ||
| .childFile('GeneratedPluginRegistrant.h'); |
There was a problem hiding this comment.
Since this is a new set of outputs, could we just use Swift unconditionally from the start, instead of adding another place where we'll need to migrate to Swift later?
| // whether it be in Swift or Objective C. If the target does not have any | ||
| // files yet, create an empty Swift file. | ||
| /// | ||
| /// When [generateEmptySources] is true (the default), it create an empty Swift source file since |
| // files yet, create an empty Swift file. | ||
| /// | ||
| /// When [generateEmptySources] is true (the default), it create an empty Swift source file since | ||
| /// swift packages require at least one source file per non-binary target. |
…erate FlutterPluginRegistrant (flutter/flutter#181224)
Roll Flutter from e8f9dc50356d to 9bda20a11f1e (34 revisions) flutter/flutter@e8f9dc5...9bda20a 2026-02-10 [email protected] Remove Material import from focus_traversal_test.dart (flutter/flutter#180994) 2026-02-10 [email protected] Roll Skia from 6e217430c052 to cffb3bf918df (1 revision) (flutter/flutter#182131) 2026-02-10 [email protected] Encourage splitting large test files in testing documentation 2 (flutter/flutter#182051) 2026-02-10 [email protected] refactor: migrate CupertinoPageTransitionsBuilder to cupertino folder (flutter/flutter#179776) 2026-02-10 [email protected] Delete the last remaining skia only fragment shader tests (flutter/flutter#182127) 2026-02-10 [email protected] [a11y][android] Set new CheckState APIs for android API 36 (flutter/flutter#182113) 2026-02-10 [email protected] Add missing dependencies to framework_tests_misc_leak_tracking (flutter/flutter#181929) 2026-02-10 [email protected] Roll Dart SDK from eee0e2e11174 to 69eb951f8f7e (2 revisions) (flutter/flutter#182128) 2026-02-10 [email protected] Marks Linux_android_emu android_display_cutout to be flaky (flutter/flutter#181901) 2026-02-10 [email protected] Bump Dart to 3.10 (flutter/flutter#174066) 2026-02-10 [email protected] Roll Skia from d4b7e24a209b to 6e217430c052 (6 revisions) (flutter/flutter#182126) 2026-02-09 [email protected] Intercept UIScene device log and print a guided warning (flutter/flutter#181515) 2026-02-09 [email protected] Introduce ScrollCacheExtent and also fixes unbound shrinkwrap cache ex… (flutter/flutter#181092) 2026-02-09 [email protected] [Android] Add mechanism for setting Android engine flags via Android manifest (take 2) (flutter/flutter#181632) 2026-02-09 [email protected] Fix wrong comment about default impeller value (flutter/flutter#181831) 2026-02-09 [email protected] fix build fail for wayland only platform (flutter/flutter#182057) 2026-02-09 [email protected] [AGP 9] Added Warning Against Updating to AGP 9 (flutter/flutter#181977) 2026-02-09 [email protected] Updated Shaderc dep (flutter/flutter#180976) 2026-02-09 [email protected] Refactor accessibility guidelines out to widget layer (flutter/flutter#181672) 2026-02-09 [email protected] Roll Skia from 68dff53238e5 to d4b7e24a209b (2 revisions) (flutter/flutter#182087) 2026-02-09 [email protected] fix: OutlineInputBorder not respecting BorderSide stroke alignment (flutter/flutter#180487) 2026-02-09 [email protected] Adds opengles to engine dart tests (flutter/flutter#181933) 2026-02-09 [email protected] Add command to build a Swift Package for Add to App and generate FlutterPluginRegistrant (flutter/flutter#181224) 2026-02-09 [email protected] Remove unused constant in `bundle.dart` (flutter/flutter#182023) 2026-02-09 [email protected] Roll Fuchsia Linux SDK from iqtwdXlgKIyZkL5Li... to 7BGf7mPQvgLi7Axb6... (flutter/flutter#182082) 2026-02-09 [email protected] Remove unused getters in `user_messages.dart` (flutter/flutter#181867) 2026-02-09 [email protected] Roll Packages from 7805d3e to 3d5eaa5 (3 revisions) (flutter/flutter#182083) 2026-02-09 [email protected] Roll Skia from 5d891cd7fb7f to 68dff53238e5 (1 revision) (flutter/flutter#182080) 2026-02-09 [email protected] Update example description (flutter/flutter#182067) 2026-02-09 [email protected] Roll Dart SDK from 965b51c219d3 to eee0e2e11174 (1 revision) (flutter/flutter#182073) 2026-02-09 [email protected] Roll Skia from 9533d7533d59 to 5d891cd7fb7f (6 revisions) (flutter/flutter#182070) 2026-02-09 [email protected] Add a new flutter cli command, running-apps, using mDNS app discovery (flutter/flutter#180098) 2026-02-09 [email protected] Roll Skia from b7db9f35f0f2 to 9533d7533d59 (2 revisions) (flutter/flutter#182069) 2026-02-08 [email protected] Improve FlWindowMonitor API (flutter/flutter#181885) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 ...
…terPluginRegistrant (flutter#181224) Fixes flutter#181221. This PR introduces a new command `flutter build swift-package`, however, the command is not yet made available while we incrementally implement it. This PR creates a `FlutterPluginRegistrant` swift package, currently with no dependencies. It also creates the `GeneratedPluginRegistrant` source files for the package. It'll create a Package.swift like so: ```swift import PackageDescription // Debug let package = Package( name: "FlutterPluginRegistrant", products: [ .library(name: "FlutterPluginRegistrant", type: .static, targets: ["FlutterPluginRegistrant"]) ], dependencies: [], targets: [ .target( name: "FlutterPluginRegistrant" ) ] ) ``` It also creates source files (GeneratedPluginRegistrant files) for each build mode and symlinks `Sources` and `Package.swift` to the first build mode (from the list of build modes passed in via args). ``` ├── FlutterPluginRegistrant │ ├── Debug │ │ ├── FlutterPluginRegistrant │ │ │ ├── GeneratedPluginRegistrant.m │ │ │ ├── include │ │ │ │ ├── GeneratedPluginRegistrant.h │ │ ├── Package.swift │ ├── Sources -> symlink to ./Debug │ ├── Package.swift -> symlink to ./Debug/Package.swift ``` In this state, the package will not function since it's missing the plugin dependencies in the Package.swift. That will come in a future PR. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…terPluginRegistrant (flutter#181224) Fixes flutter#181221. This PR introduces a new command `flutter build swift-package`, however, the command is not yet made available while we incrementally implement it. This PR creates a `FlutterPluginRegistrant` swift package, currently with no dependencies. It also creates the `GeneratedPluginRegistrant` source files for the package. It'll create a Package.swift like so: ```swift import PackageDescription // Debug let package = Package( name: "FlutterPluginRegistrant", products: [ .library(name: "FlutterPluginRegistrant", type: .static, targets: ["FlutterPluginRegistrant"]) ], dependencies: [], targets: [ .target( name: "FlutterPluginRegistrant" ) ] ) ``` It also creates source files (GeneratedPluginRegistrant files) for each build mode and symlinks `Sources` and `Package.swift` to the first build mode (from the list of build modes passed in via args). ``` ├── FlutterPluginRegistrant │ ├── Debug │ │ ├── FlutterPluginRegistrant │ │ │ ├── GeneratedPluginRegistrant.m │ │ │ ├── include │ │ │ │ ├── GeneratedPluginRegistrant.h │ │ ├── Package.swift │ ├── Sources -> symlink to ./Debug │ ├── Package.swift -> symlink to ./Debug/Package.swift ``` In this state, the package will not function since it's missing the plugin dependencies in the Package.swift. That will come in a future PR. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
Fixes #181221.
This PR introduces a new command
flutter build swift-package, however, the command is not yet made available while we incrementally implement it.This PR creates a
FlutterPluginRegistrantswift package, currently with no dependencies. It also creates theGeneratedPluginRegistrantsource files for the package.It'll create a Package.swift like so:
It also creates source files (GeneratedPluginRegistrant files) for each build mode and symlinks
SourcesandPackage.swiftto the first build mode (from the list of build modes passed in via args).In this state, the package will not function since it's missing the plugin dependencies in the Package.swift. That will come in a future PR.
Pre-launch Checklist
///).If you need help, consider asking for advice on the #hackers-new channel on Discord.
Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the
gemini-code-assistbot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.