mirror of
https://github.com/flutter/packages.git
synced 2025-08-06 17:28:42 +08:00
Add CI steps to test iOS and macOS plugins with both CocoaPods and Swift Package Manager (#6557)
Tests new Swift Package Manager feature added in https://github.com/flutter/flutter/pull/146256. Fixes https://github.com/flutter/flutter/issues/146901.
This commit is contained in:

committed by
GitHub

parent
2925db2792
commit
1292dc30d8
@ -11,7 +11,7 @@ tasks:
|
|||||||
infra_step: true
|
infra_step: true
|
||||||
- name: build examples
|
- name: build examples
|
||||||
script: .ci/scripts/tool_runner.sh
|
script: .ci/scripts/tool_runner.sh
|
||||||
args: ["build-examples", "--ios"]
|
args: ["build-examples", "--ios", "--swift-package-manager"]
|
||||||
- name: xcode analyze
|
- name: xcode analyze
|
||||||
script: .ci/scripts/tool_runner.sh
|
script: .ci/scripts/tool_runner.sh
|
||||||
args: ["xcode-analyze", "--ios"]
|
args: ["xcode-analyze", "--ios"]
|
||||||
|
@ -8,7 +8,7 @@ tasks:
|
|||||||
infra_step: true
|
infra_step: true
|
||||||
- name: build examples
|
- name: build examples
|
||||||
script: .ci/scripts/tool_runner.sh
|
script: .ci/scripts/tool_runner.sh
|
||||||
args: ["build-examples", "--macos"]
|
args: ["build-examples", "--macos", "--swift-package-manager"]
|
||||||
- name: xcode analyze
|
- name: xcode analyze
|
||||||
script: .ci/scripts/tool_runner.sh
|
script: .ci/scripts/tool_runner.sh
|
||||||
args: ["xcode-analyze", "--macos"]
|
args: ["xcode-analyze", "--macos"]
|
||||||
|
@ -38,6 +38,9 @@ const String _flutterBuildTypeWindows = 'windows';
|
|||||||
|
|
||||||
const String _flutterBuildTypeAndroidAlias = 'android';
|
const String _flutterBuildTypeAndroidAlias = 'android';
|
||||||
|
|
||||||
|
/// Key for Swift Package Manager.
|
||||||
|
const String _swiftPackageManagerFlag = 'swift-package-manager';
|
||||||
|
|
||||||
/// A command to build the example applications for packages.
|
/// A command to build the example applications for packages.
|
||||||
class BuildExamplesCommand extends PackageLoopingCommand {
|
class BuildExamplesCommand extends PackageLoopingCommand {
|
||||||
/// Creates an instance of the build command.
|
/// Creates an instance of the build command.
|
||||||
@ -58,6 +61,7 @@ class BuildExamplesCommand extends PackageLoopingCommand {
|
|||||||
defaultsTo: '',
|
defaultsTo: '',
|
||||||
help: 'Enables the given Dart SDK experiments.',
|
help: 'Enables the given Dart SDK experiments.',
|
||||||
);
|
);
|
||||||
|
argParser.addFlag(_swiftPackageManagerFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Maps the switch this command uses to identify a platform to information
|
// Maps the switch this command uses to identify a platform to information
|
||||||
@ -111,6 +115,15 @@ class BuildExamplesCommand extends PackageLoopingCommand {
|
|||||||
'single key "$_pluginToolsConfigGlobalKey" containing a list of build '
|
'single key "$_pluginToolsConfigGlobalKey" containing a list of build '
|
||||||
'arguments.';
|
'arguments.';
|
||||||
|
|
||||||
|
/// Returns true if `--swift-package-manager` flag was passed along with
|
||||||
|
/// either `--ios` or `--macos`.
|
||||||
|
bool get usingSwiftPackageManager {
|
||||||
|
final List<String> platformFlags = _platforms.keys.toList();
|
||||||
|
return getBoolArg(_swiftPackageManagerFlag) &&
|
||||||
|
(platformFlags.contains(platformIOS) ||
|
||||||
|
platformFlags.contains(platformMacOS));
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> initializeRun() async {
|
Future<void> initializeRun() async {
|
||||||
final List<String> platformFlags = _platforms.keys.toList();
|
final List<String> platformFlags = _platforms.keys.toList();
|
||||||
@ -121,6 +134,17 @@ class BuildExamplesCommand extends PackageLoopingCommand {
|
|||||||
'were specified. At least one platform must be provided.');
|
'were specified. At least one platform must be provided.');
|
||||||
throw ToolExit(_exitNoPlatformFlags);
|
throw ToolExit(_exitNoPlatformFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(vashworth): Enable on stable once Swift Package Manager feature is
|
||||||
|
// available on stable.
|
||||||
|
if (usingSwiftPackageManager &&
|
||||||
|
platform.environment['CHANNEL'] != 'stable') {
|
||||||
|
await processRunner.runAndStream(
|
||||||
|
flutterCommand,
|
||||||
|
<String>['config', '--enable-swift-package-manager'],
|
||||||
|
exitOnError: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -164,6 +164,98 @@ void main() {
|
|||||||
]));
|
]));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('building for iOS with Swift Package Manager on master channel',
|
||||||
|
() async {
|
||||||
|
mockPlatform.isMacOS = true;
|
||||||
|
mockPlatform.environment['CHANNEL'] = 'master';
|
||||||
|
|
||||||
|
final RepositoryPackage plugin = createFakePlugin('plugin', packagesDir,
|
||||||
|
platformSupport: <String, PlatformDetails>{
|
||||||
|
platformIOS: const PlatformDetails(PlatformSupport.inline),
|
||||||
|
});
|
||||||
|
|
||||||
|
final Directory pluginExampleDirectory = getExampleDir(plugin);
|
||||||
|
|
||||||
|
final List<String> output = await runCapturingPrint(runner, <String>[
|
||||||
|
'build-examples',
|
||||||
|
'--ios',
|
||||||
|
'--enable-experiment=exp1',
|
||||||
|
'--swift-package-manager',
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
output,
|
||||||
|
containsAllInOrder(<String>[
|
||||||
|
'\nBUILDING plugin/example for iOS',
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
processRunner.recordedCalls,
|
||||||
|
orderedEquals(<ProcessCall>[
|
||||||
|
ProcessCall(
|
||||||
|
getFlutterCommand(mockPlatform),
|
||||||
|
const <String>['config', '--enable-swift-package-manager'],
|
||||||
|
null,
|
||||||
|
),
|
||||||
|
ProcessCall(
|
||||||
|
getFlutterCommand(mockPlatform),
|
||||||
|
const <String>[
|
||||||
|
'build',
|
||||||
|
'ios',
|
||||||
|
'--no-codesign',
|
||||||
|
'--enable-experiment=exp1'
|
||||||
|
],
|
||||||
|
pluginExampleDirectory.path,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'building for iOS with Swift Package Manager on stable channel does not enable SPM',
|
||||||
|
() async {
|
||||||
|
mockPlatform.isMacOS = true;
|
||||||
|
mockPlatform.environment['CHANNEL'] = 'stable';
|
||||||
|
|
||||||
|
final RepositoryPackage plugin = createFakePlugin('plugin', packagesDir,
|
||||||
|
platformSupport: <String, PlatformDetails>{
|
||||||
|
platformIOS: const PlatformDetails(PlatformSupport.inline),
|
||||||
|
});
|
||||||
|
|
||||||
|
final Directory pluginExampleDirectory = getExampleDir(plugin);
|
||||||
|
|
||||||
|
final List<String> output = await runCapturingPrint(runner, <String>[
|
||||||
|
'build-examples',
|
||||||
|
'--ios',
|
||||||
|
'--enable-experiment=exp1',
|
||||||
|
'--swift-package-manager',
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
output,
|
||||||
|
containsAllInOrder(<String>[
|
||||||
|
'\nBUILDING plugin/example for iOS',
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
processRunner.recordedCalls,
|
||||||
|
orderedEquals(<ProcessCall>[
|
||||||
|
ProcessCall(
|
||||||
|
getFlutterCommand(mockPlatform),
|
||||||
|
const <String>[
|
||||||
|
'build',
|
||||||
|
'ios',
|
||||||
|
'--no-codesign',
|
||||||
|
'--enable-experiment=exp1'
|
||||||
|
],
|
||||||
|
pluginExampleDirectory.path,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test(
|
test(
|
||||||
'building for Linux when plugin is not set up for Linux results in no-op',
|
'building for Linux when plugin is not set up for Linux results in no-op',
|
||||||
() async {
|
() async {
|
||||||
@ -261,6 +353,86 @@ void main() {
|
|||||||
]));
|
]));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('building for macOS with Swift Package Manager on master channel',
|
||||||
|
() async {
|
||||||
|
mockPlatform.isMacOS = true;
|
||||||
|
mockPlatform.environment['CHANNEL'] = 'master';
|
||||||
|
|
||||||
|
final RepositoryPackage plugin = createFakePlugin('plugin', packagesDir,
|
||||||
|
platformSupport: <String, PlatformDetails>{
|
||||||
|
platformMacOS: const PlatformDetails(PlatformSupport.inline),
|
||||||
|
});
|
||||||
|
|
||||||
|
final Directory pluginExampleDirectory = getExampleDir(plugin);
|
||||||
|
|
||||||
|
final List<String> output = await runCapturingPrint(runner,
|
||||||
|
<String>['build-examples', '--macos', '--swift-package-manager']);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
output,
|
||||||
|
containsAllInOrder(<String>[
|
||||||
|
'\nBUILDING plugin/example for macOS',
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
processRunner.recordedCalls,
|
||||||
|
orderedEquals(<ProcessCall>[
|
||||||
|
ProcessCall(
|
||||||
|
getFlutterCommand(mockPlatform),
|
||||||
|
const <String>['config', '--enable-swift-package-manager'],
|
||||||
|
null,
|
||||||
|
),
|
||||||
|
ProcessCall(
|
||||||
|
getFlutterCommand(mockPlatform),
|
||||||
|
const <String>[
|
||||||
|
'build',
|
||||||
|
'macos',
|
||||||
|
],
|
||||||
|
pluginExampleDirectory.path,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
'building for macOS with Swift Package Manager on stable channel does not enable SPM',
|
||||||
|
() async {
|
||||||
|
mockPlatform.isMacOS = true;
|
||||||
|
mockPlatform.environment['CHANNEL'] = 'stable';
|
||||||
|
|
||||||
|
final RepositoryPackage plugin = createFakePlugin('plugin', packagesDir,
|
||||||
|
platformSupport: <String, PlatformDetails>{
|
||||||
|
platformMacOS: const PlatformDetails(PlatformSupport.inline),
|
||||||
|
});
|
||||||
|
|
||||||
|
final Directory pluginExampleDirectory = getExampleDir(plugin);
|
||||||
|
|
||||||
|
final List<String> output = await runCapturingPrint(runner,
|
||||||
|
<String>['build-examples', '--macos', '--swift-package-manager']);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
output,
|
||||||
|
containsAllInOrder(<String>[
|
||||||
|
'\nBUILDING plugin/example for macOS',
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
processRunner.recordedCalls,
|
||||||
|
orderedEquals(<ProcessCall>[
|
||||||
|
ProcessCall(
|
||||||
|
getFlutterCommand(mockPlatform),
|
||||||
|
const <String>[
|
||||||
|
'build',
|
||||||
|
'macos',
|
||||||
|
],
|
||||||
|
pluginExampleDirectory.path,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test('building for web with no implementation results in no-op', () async {
|
test('building for web with no implementation results in no-op', () async {
|
||||||
createFakePlugin('plugin', packagesDir);
|
createFakePlugin('plugin', packagesDir);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user