mirror of
https://github.com/flutter/flutter
synced 2024-08-24 18:36:03 +00:00
Add create app and plugin templates for Swift Package Manager (#147082)
When Swift Package Manager feature is enabled, create app and create plugin will have Swift Package Manager integration already added and will not need to undergo a migration. Fixes https://github.com/flutter/flutter/issues/146371. ``` flutter config --enable-swift-package-manager flutter create --ios-language swift --platforms ios,macos swift_app_name flutter create --ios-language objc --platforms ios objc_app_name flutter create --template=plugin --ios-language swift --platforms ios,macos swift_plugin_name flutter create --template=plugin --ios-language objc --platforms ios objc_plugin_name ```
This commit is contained in:
parent
d85571b46b
commit
5a63b1df95
|
@ -21,6 +21,8 @@ import '../flutter_manifest.dart';
|
||||||
import '../flutter_project_metadata.dart';
|
import '../flutter_project_metadata.dart';
|
||||||
import '../globals.dart' as globals;
|
import '../globals.dart' as globals;
|
||||||
import '../ios/code_signing.dart';
|
import '../ios/code_signing.dart';
|
||||||
|
import '../macos/swift_package_manager.dart';
|
||||||
|
import '../macos/swift_packages.dart';
|
||||||
import '../project.dart';
|
import '../project.dart';
|
||||||
import '../reporting/reporting.dart';
|
import '../reporting/reporting.dart';
|
||||||
import '../runner/flutter_command.dart';
|
import '../runner/flutter_command.dart';
|
||||||
|
@ -324,6 +326,7 @@ class CreateCommand extends CreateBase {
|
||||||
projectDescription: stringArg('description'),
|
projectDescription: stringArg('description'),
|
||||||
flutterRoot: flutterRoot,
|
flutterRoot: flutterRoot,
|
||||||
withPlatformChannelPluginHook: generateMethodChannelsPlugin,
|
withPlatformChannelPluginHook: generateMethodChannelsPlugin,
|
||||||
|
withSwiftPackageManager: featureFlags.isSwiftPackageManagerEnabled,
|
||||||
withFfiPluginHook: generateFfiPlugin,
|
withFfiPluginHook: generateFfiPlugin,
|
||||||
withFfiPackage: generateFfiPackage,
|
withFfiPackage: generateFfiPackage,
|
||||||
withEmptyMain: emptyArgument,
|
withEmptyMain: emptyArgument,
|
||||||
|
@ -603,8 +606,21 @@ Your $application code is in $relativeAppMain.
|
||||||
? stringArg('description')
|
? stringArg('description')
|
||||||
: 'A new Flutter plugin project.';
|
: 'A new Flutter plugin project.';
|
||||||
templateContext['description'] = description;
|
templateContext['description'] = description;
|
||||||
|
|
||||||
|
final String? projectName = templateContext['projectName'] as String?;
|
||||||
|
final List<String> templates = <String>['plugin', 'plugin_shared'];
|
||||||
|
if ((templateContext['ios'] == true || templateContext['macos'] == true) && featureFlags.isSwiftPackageManagerEnabled) {
|
||||||
|
templates.add('plugin_swift_package_manager');
|
||||||
|
templateContext['swiftLibraryName'] = projectName?.replaceAll('_', '-');
|
||||||
|
templateContext['swiftToolsVersion'] = minimumSwiftToolchainVersion;
|
||||||
|
templateContext['iosSupportedPlatform'] = SwiftPackageManager.iosSwiftPackageSupportedPlatform.format();
|
||||||
|
templateContext['macosSupportedPlatform'] = SwiftPackageManager.macosSwiftPackageSupportedPlatform.format();
|
||||||
|
} else {
|
||||||
|
templates.add('plugin_cocoapods');
|
||||||
|
}
|
||||||
|
|
||||||
generatedCount += await renderMerged(
|
generatedCount += await renderMerged(
|
||||||
<String>['plugin', 'plugin_shared'],
|
templates,
|
||||||
directory,
|
directory,
|
||||||
templateContext,
|
templateContext,
|
||||||
overwrite: overwrite,
|
overwrite: overwrite,
|
||||||
|
@ -618,7 +634,6 @@ Your $application code is in $relativeAppMain.
|
||||||
project: project, requireAndroidSdk: false);
|
project: project, requireAndroidSdk: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String? projectName = templateContext['projectName'] as String?;
|
|
||||||
final String organization = templateContext['organization']! as String; // Required to make the context.
|
final String organization = templateContext['organization']! as String; // Required to make the context.
|
||||||
final String? androidPluginIdentifier = templateContext['androidIdentifier'] as String?;
|
final String? androidPluginIdentifier = templateContext['androidIdentifier'] as String?;
|
||||||
final String exampleProjectName = '${projectName}_example';
|
final String exampleProjectName = '${projectName}_example';
|
||||||
|
|
|
@ -351,6 +351,7 @@ abstract class CreateBase extends FlutterCommand {
|
||||||
String? kotlinVersion,
|
String? kotlinVersion,
|
||||||
String? gradleVersion,
|
String? gradleVersion,
|
||||||
bool withPlatformChannelPluginHook = false,
|
bool withPlatformChannelPluginHook = false,
|
||||||
|
bool withSwiftPackageManager = false,
|
||||||
bool withFfiPluginHook = false,
|
bool withFfiPluginHook = false,
|
||||||
bool withFfiPackage = false,
|
bool withFfiPackage = false,
|
||||||
bool withEmptyMain = false,
|
bool withEmptyMain = false,
|
||||||
|
@ -404,6 +405,7 @@ abstract class CreateBase extends FlutterCommand {
|
||||||
'withFfiPackage': withFfiPackage,
|
'withFfiPackage': withFfiPackage,
|
||||||
'withFfiPluginHook': withFfiPluginHook,
|
'withFfiPluginHook': withFfiPluginHook,
|
||||||
'withPlatformChannelPluginHook': withPlatformChannelPluginHook,
|
'withPlatformChannelPluginHook': withPlatformChannelPluginHook,
|
||||||
|
'withSwiftPackageManager': withSwiftPackageManager,
|
||||||
'withPluginHook': withFfiPluginHook || withFfiPackage || withPlatformChannelPluginHook,
|
'withPluginHook': withFfiPluginHook || withFfiPackage || withPlatformChannelPluginHook,
|
||||||
'withEmptyMain': withEmptyMain,
|
'withEmptyMain': withEmptyMain,
|
||||||
'androidLanguage': androidLanguage,
|
'androidLanguage': androidLanguage,
|
||||||
|
|
|
@ -30,12 +30,12 @@ class SwiftPackageManager {
|
||||||
|
|
||||||
static const String _defaultFlutterPluginsSwiftPackageName = 'FlutterGeneratedPluginSwiftPackage';
|
static const String _defaultFlutterPluginsSwiftPackageName = 'FlutterGeneratedPluginSwiftPackage';
|
||||||
|
|
||||||
static final SwiftPackageSupportedPlatform _iosSwiftPackageSupportedPlatform = SwiftPackageSupportedPlatform(
|
static final SwiftPackageSupportedPlatform iosSwiftPackageSupportedPlatform = SwiftPackageSupportedPlatform(
|
||||||
platform: SwiftPackagePlatform.ios,
|
platform: SwiftPackagePlatform.ios,
|
||||||
version: Version(12, 0, null),
|
version: Version(12, 0, null),
|
||||||
);
|
);
|
||||||
|
|
||||||
static final SwiftPackageSupportedPlatform _macosSwiftPackageSupportedPlatform = SwiftPackageSupportedPlatform(
|
static final SwiftPackageSupportedPlatform macosSwiftPackageSupportedPlatform = SwiftPackageSupportedPlatform(
|
||||||
platform: SwiftPackagePlatform.macos,
|
platform: SwiftPackagePlatform.macos,
|
||||||
version: Version(10, 14, null),
|
version: Version(10, 14, null),
|
||||||
);
|
);
|
||||||
|
@ -66,9 +66,9 @@ class SwiftPackageManager {
|
||||||
|
|
||||||
final SwiftPackageSupportedPlatform swiftSupportedPlatform;
|
final SwiftPackageSupportedPlatform swiftSupportedPlatform;
|
||||||
if (platform == SupportedPlatform.ios) {
|
if (platform == SupportedPlatform.ios) {
|
||||||
swiftSupportedPlatform = _iosSwiftPackageSupportedPlatform;
|
swiftSupportedPlatform = iosSwiftPackageSupportedPlatform;
|
||||||
} else {
|
} else {
|
||||||
swiftSupportedPlatform = _macosSwiftPackageSupportedPlatform;
|
swiftSupportedPlatform = macosSwiftPackageSupportedPlatform;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FlutterGeneratedPluginSwiftPackage must be statically linked to ensure
|
// FlutterGeneratedPluginSwiftPackage must be statically linked to ensure
|
||||||
|
@ -169,10 +169,10 @@ class SwiftPackageManager {
|
||||||
final SwiftPackageSupportedPlatform defaultPlatform;
|
final SwiftPackageSupportedPlatform defaultPlatform;
|
||||||
final SwiftPackagePlatform packagePlatform;
|
final SwiftPackagePlatform packagePlatform;
|
||||||
if (platform == SupportedPlatform.ios) {
|
if (platform == SupportedPlatform.ios) {
|
||||||
defaultPlatform = _iosSwiftPackageSupportedPlatform;
|
defaultPlatform = iosSwiftPackageSupportedPlatform;
|
||||||
packagePlatform = SwiftPackagePlatform.ios;
|
packagePlatform = SwiftPackagePlatform.ios;
|
||||||
} else {
|
} else {
|
||||||
defaultPlatform = _macosSwiftPackageSupportedPlatform;
|
defaultPlatform = macosSwiftPackageSupportedPlatform;
|
||||||
packagePlatform = SwiftPackagePlatform.macos;
|
packagePlatform = SwiftPackagePlatform.macos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,9 @@
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
331C80F4294D02FB00263BE5 /* RunnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 331C80F3294D02FB00263BE5 /* RunnerTests.m */; };
|
331C80F4294D02FB00263BE5 /* RunnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 331C80F3294D02FB00263BE5 /* RunnerTests.m */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
|
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
|
||||||
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
|
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
|
@ -71,6 +74,9 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -176,6 +182,11 @@
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = Runner;
|
name = Runner;
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
packageProductDependencies = (
|
||||||
|
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
|
||||||
|
);
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
productName = Runner;
|
productName = Runner;
|
||||||
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
|
@ -208,6 +219,11 @@
|
||||||
Base,
|
Base,
|
||||||
);
|
);
|
||||||
mainGroup = 97C146E51CF9000F007C117D;
|
mainGroup = 97C146E51CF9000F007C117D;
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
packageReferences = (
|
||||||
|
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
|
||||||
|
);
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
|
@ -619,6 +635,22 @@
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
|
||||||
|
/* Begin XCLocalSwiftPackageReference section */
|
||||||
|
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
|
||||||
|
isa = XCLocalSwiftPackageReference;
|
||||||
|
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
|
||||||
|
};
|
||||||
|
/* End XCLocalSwiftPackageReference section */
|
||||||
|
|
||||||
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
|
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
productName = FlutterGeneratedPluginSwiftPackage;
|
||||||
|
};
|
||||||
|
/* End XCSwiftPackageProductDependency section */
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
};
|
};
|
||||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,26 @@
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES">
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
<PreActions>
|
||||||
|
<ExecutionAction
|
||||||
|
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
||||||
|
<ActionContent
|
||||||
|
title = "Run Prepare Flutter Framework Script"
|
||||||
|
scriptText = "/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare ">
|
||||||
|
<EnvironmentBuildable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||||
|
BuildableName = "Runner.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</EnvironmentBuildable>
|
||||||
|
</ActionContent>
|
||||||
|
</ExecutionAction>
|
||||||
|
</PreActions>
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
|
@ -3,6 +3,11 @@
|
||||||
#import <XCTest/XCTest.h>
|
#import <XCTest/XCTest.h>
|
||||||
{{#withPlatformChannelPluginHook}}
|
{{#withPlatformChannelPluginHook}}
|
||||||
|
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
// If your plugin has been explicitly set to "type: .dynamic" in the Package.swift,
|
||||||
|
// you will need to add your plugin as a dependency of RunnerTests within Xcode.
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
|
|
||||||
@import {{pluginProjectName}};
|
@import {{pluginProjectName}};
|
||||||
|
|
||||||
// This demonstrates a simple unit test of the Objective-C portion of this plugin's implementation.
|
// This demonstrates a simple unit test of the Objective-C portion of this plugin's implementation.
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
|
@ -62,6 +65,9 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -157,6 +163,11 @@
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = Runner;
|
name = Runner;
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
packageProductDependencies = (
|
||||||
|
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
|
||||||
|
);
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
productName = Runner;
|
productName = Runner;
|
||||||
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
|
@ -190,6 +201,11 @@
|
||||||
Base,
|
Base,
|
||||||
);
|
);
|
||||||
mainGroup = 97C146E51CF9000F007C117D;
|
mainGroup = 97C146E51CF9000F007C117D;
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
packageReferences = (
|
||||||
|
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
|
||||||
|
);
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
|
@ -620,6 +636,22 @@
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
|
||||||
|
/* Begin XCLocalSwiftPackageReference section */
|
||||||
|
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
|
||||||
|
isa = XCLocalSwiftPackageReference;
|
||||||
|
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
|
||||||
|
};
|
||||||
|
/* End XCLocalSwiftPackageReference section */
|
||||||
|
|
||||||
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
|
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
productName = FlutterGeneratedPluginSwiftPackage;
|
||||||
|
};
|
||||||
|
/* End XCSwiftPackageProductDependency section */
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
};
|
};
|
||||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,26 @@
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES">
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
<PreActions>
|
||||||
|
<ExecutionAction
|
||||||
|
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
||||||
|
<ActionContent
|
||||||
|
title = "Run Prepare Flutter Framework Script"
|
||||||
|
scriptText = "/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare ">
|
||||||
|
<EnvironmentBuildable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||||
|
BuildableName = "Runner.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</EnvironmentBuildable>
|
||||||
|
</ActionContent>
|
||||||
|
</ExecutionAction>
|
||||||
|
</PreActions>
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
|
@ -3,6 +3,11 @@ import UIKit
|
||||||
import XCTest
|
import XCTest
|
||||||
{{#withPlatformChannelPluginHook}}
|
{{#withPlatformChannelPluginHook}}
|
||||||
|
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
// If your plugin has been explicitly set to "type: .dynamic" in the Package.swift,
|
||||||
|
// you will need to add your plugin as a dependency of RunnerTests within Xcode.
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
|
|
||||||
@testable import {{pluginProjectName}}
|
@testable import {{pluginProjectName}}
|
||||||
|
|
||||||
// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
|
// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
||||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
||||||
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
@ -92,6 +95,9 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -216,6 +222,11 @@
|
||||||
33CC11202044C79F0003C045 /* PBXTargetDependency */,
|
33CC11202044C79F0003C045 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = Runner;
|
name = Runner;
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
packageProductDependencies = (
|
||||||
|
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
|
||||||
|
);
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
productName = Runner;
|
productName = Runner;
|
||||||
productReference = 33CC10ED2044A3C60003C045 /* {{projectName}}.app */;
|
productReference = 33CC10ED2044A3C60003C045 /* {{projectName}}.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
|
@ -260,6 +271,11 @@
|
||||||
Base,
|
Base,
|
||||||
);
|
);
|
||||||
mainGroup = 33CC10E42044A3C60003C045;
|
mainGroup = 33CC10E42044A3C60003C045;
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
packageReferences = (
|
||||||
|
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
|
||||||
|
);
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
|
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
|
@ -700,6 +716,22 @@
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
|
||||||
|
/* Begin XCLocalSwiftPackageReference section */
|
||||||
|
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
|
||||||
|
isa = XCLocalSwiftPackageReference;
|
||||||
|
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
|
||||||
|
};
|
||||||
|
/* End XCLocalSwiftPackageReference section */
|
||||||
|
|
||||||
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
|
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
productName = FlutterGeneratedPluginSwiftPackage;
|
||||||
|
};
|
||||||
|
/* End XCSwiftPackageProductDependency section */
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
};
|
};
|
||||||
rootObject = 33CC10E52044A3C60003C045 /* Project object */;
|
rootObject = 33CC10E52044A3C60003C045 /* Project object */;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,26 @@
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES">
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
<PreActions>
|
||||||
|
<ExecutionAction
|
||||||
|
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
||||||
|
<ActionContent
|
||||||
|
title = "Run Prepare Flutter Framework Script"
|
||||||
|
scriptText = ""$FLUTTER_ROOT"/packages/flutter_tools/bin/macos_assemble.sh prepare ">
|
||||||
|
<EnvironmentBuildable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
|
BuildableName = "{{projectName}}.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</EnvironmentBuildable>
|
||||||
|
</ActionContent>
|
||||||
|
</ExecutionAction>
|
||||||
|
</PreActions>
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
||||||
|
|
|
@ -3,6 +3,11 @@ import FlutterMacOS
|
||||||
import XCTest
|
import XCTest
|
||||||
{{#withPlatformChannelPluginHook}}
|
{{#withPlatformChannelPluginHook}}
|
||||||
|
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
// If your plugin has been explicitly set to "type: .dynamic" in the Package.swift,
|
||||||
|
// you will need to add your plugin as a dependency of RunnerTests within Xcode.
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
|
|
||||||
@testable import {{pluginProjectName}}
|
@testable import {{pluginProjectName}}
|
||||||
|
|
||||||
// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
|
// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
|
||||||
|
|
|
@ -13,8 +13,14 @@ Pod::Spec.new do |s|
|
||||||
s.license = { :file => '../LICENSE' }
|
s.license = { :file => '../LICENSE' }
|
||||||
s.author = { 'Your Company' => 'email@example.com' }
|
s.author = { 'Your Company' => 'email@example.com' }
|
||||||
s.source = { :path => '.' }
|
s.source = { :path => '.' }
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
s.source_files = '{{projectName}}/Sources/{{projectName}}/**/*'
|
||||||
|
s.public_header_files = '{{projectName}}/Sources/{{projectName}}/include/{{projectName}}/**/*.h'
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
|
{{^withSwiftPackageManager}}
|
||||||
s.source_files = 'Classes/**/*'
|
s.source_files = 'Classes/**/*'
|
||||||
s.public_header_files = 'Classes/**/*.h'
|
s.public_header_files = 'Classes/**/*.h'
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
s.dependency 'Flutter'
|
s.dependency 'Flutter'
|
||||||
s.platform = :ios, '12.0'
|
s.platform = :ios, '12.0'
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,12 @@ Pod::Spec.new do |s|
|
||||||
s.license = { :file => '../LICENSE' }
|
s.license = { :file => '../LICENSE' }
|
||||||
s.author = { 'Your Company' => 'email@example.com' }
|
s.author = { 'Your Company' => 'email@example.com' }
|
||||||
s.source = { :path => '.' }
|
s.source = { :path => '.' }
|
||||||
|
{{#withSwiftPackageManager}}
|
||||||
|
s.source_files = '{{projectName}}/Sources/{{projectName}}/**/*'
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
|
{{^withSwiftPackageManager}}
|
||||||
s.source_files = 'Classes/**/*'
|
s.source_files = 'Classes/**/*'
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
s.dependency 'Flutter'
|
s.dependency 'Flutter'
|
||||||
s.platform = :ios, '12.0'
|
s.platform = :ios, '12.0'
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,12 @@ Pod::Spec.new do |s|
|
||||||
# `../src/*` so that the C sources can be shared among all target platforms.
|
# `../src/*` so that the C sources can be shared among all target platforms.
|
||||||
{{/withFfiPluginHook}}
|
{{/withFfiPluginHook}}
|
||||||
s.source = { :path => '.' }
|
s.source = { :path => '.' }
|
||||||
s.source_files = 'Classes/**/*'
|
{{#withSwiftPackageManager}}
|
||||||
|
s.source_files = '{{projectName}}/Sources/{{projectName}}/**/*'
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
|
{{^withSwiftPackageManager}}
|
||||||
|
s.source_files = 'Classes/**/*'
|
||||||
|
{{/withSwiftPackageManager}}
|
||||||
s.dependency 'FlutterMacOS'
|
s.dependency 'FlutterMacOS'
|
||||||
|
|
||||||
s.platform = :osx, '10.11'
|
s.platform = :osx, '10.11'
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
// swift-tools-version: {{swiftToolsVersion}}
|
||||||
|
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "{{projectName}}",
|
||||||
|
platforms: [
|
||||||
|
{{iosSupportedPlatform}}
|
||||||
|
],
|
||||||
|
products: [
|
||||||
|
.library(name: "{{swiftLibraryName}}", targets: ["{{projectName}}"])
|
||||||
|
],
|
||||||
|
dependencies: [],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "{{projectName}}",
|
||||||
|
dependencies: [],
|
||||||
|
resources: [
|
||||||
|
.process("Resources"),
|
||||||
|
],
|
||||||
|
cSettings: [
|
||||||
|
.headerSearchPath("include/{{projectName}}"),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
|
@ -0,0 +1,4 @@
|
||||||
|
#import <Flutter/Flutter.h>
|
||||||
|
|
||||||
|
@interface {{pluginClass}} : NSObject<FlutterPlugin>
|
||||||
|
@end
|
|
@ -0,0 +1,20 @@
|
||||||
|
#import "{{pluginClass}}.h"
|
||||||
|
|
||||||
|
@implementation {{pluginClass}}
|
||||||
|
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
|
||||||
|
FlutterMethodChannel* channel = [FlutterMethodChannel
|
||||||
|
methodChannelWithName:@"{{projectName}}"
|
||||||
|
binaryMessenger:[registrar messenger]];
|
||||||
|
{{pluginClass}}* instance = [[{{pluginClass}} alloc] init];
|
||||||
|
[registrar addMethodCallDelegate:instance channel:channel];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
|
||||||
|
if ([@"getPlatformVersion" isEqualToString:call.method]) {
|
||||||
|
result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
|
||||||
|
} else {
|
||||||
|
result(FlutterMethodNotImplemented);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,24 @@
|
||||||
|
// swift-tools-version: {{swiftToolsVersion}}
|
||||||
|
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "{{projectName}}",
|
||||||
|
platforms: [
|
||||||
|
{{iosSupportedPlatform}}
|
||||||
|
],
|
||||||
|
products: [
|
||||||
|
.library(name: "{{swiftLibraryName}}", targets: ["{{projectName}}"])
|
||||||
|
],
|
||||||
|
dependencies: [],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "{{projectName}}",
|
||||||
|
dependencies: [],
|
||||||
|
resources: [
|
||||||
|
.process("Resources"),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
|
@ -0,0 +1,19 @@
|
||||||
|
import Flutter
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
public class {{pluginClass}}: NSObject, FlutterPlugin {
|
||||||
|
public static func register(with registrar: FlutterPluginRegistrar) {
|
||||||
|
let channel = FlutterMethodChannel(name: "{{projectName}}", binaryMessenger: registrar.messenger())
|
||||||
|
let instance = {{pluginClass}}()
|
||||||
|
registrar.addMethodCallDelegate(instance, channel: channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
||||||
|
switch call.method {
|
||||||
|
case "getPlatformVersion":
|
||||||
|
result("iOS " + UIDevice.current.systemVersion)
|
||||||
|
default:
|
||||||
|
result(FlutterMethodNotImplemented)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
// swift-tools-version: {{swiftToolsVersion}}
|
||||||
|
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "{{projectName}}",
|
||||||
|
platforms: [
|
||||||
|
{{macosSupportedPlatform}}
|
||||||
|
],
|
||||||
|
products: [
|
||||||
|
.library(name: "{{swiftLibraryName}}", targets: ["{{projectName}}"])
|
||||||
|
],
|
||||||
|
dependencies: [],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "{{projectName}}",
|
||||||
|
dependencies: [],
|
||||||
|
resources: [
|
||||||
|
.process("Resources"),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
|
@ -0,0 +1,19 @@
|
||||||
|
import Cocoa
|
||||||
|
import FlutterMacOS
|
||||||
|
|
||||||
|
public class {{pluginClass}}: NSObject, FlutterPlugin {
|
||||||
|
public static func register(with registrar: FlutterPluginRegistrar) {
|
||||||
|
let channel = FlutterMethodChannel(name: "{{projectName}}", binaryMessenger: registrar.messenger)
|
||||||
|
let instance = {{pluginClass}}()
|
||||||
|
registrar.addMethodCallDelegate(instance, channel: channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
||||||
|
switch call.method {
|
||||||
|
case "getPlatformVersion":
|
||||||
|
result("macOS " + ProcessInfo.processInfo.operatingSystemVersionString)
|
||||||
|
default:
|
||||||
|
result(FlutterMethodNotImplemented)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,13 +40,13 @@
|
||||||
"templates/app_shared/android.tmpl/gradle/wrapper/gradle-wrapper.properties.tmpl",
|
"templates/app_shared/android.tmpl/gradle/wrapper/gradle-wrapper.properties.tmpl",
|
||||||
"templates/app_shared/android.tmpl/settings.gradle",
|
"templates/app_shared/android.tmpl/settings.gradle",
|
||||||
"templates/app_shared/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl",
|
"templates/app_shared/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl",
|
||||||
"templates/app_shared/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
|
"templates/app_shared/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl",
|
||||||
"templates/app_shared/ios-objc.tmpl/Runner/AppDelegate.h",
|
"templates/app_shared/ios-objc.tmpl/Runner/AppDelegate.h",
|
||||||
"templates/app_shared/ios-objc.tmpl/Runner/AppDelegate.m",
|
"templates/app_shared/ios-objc.tmpl/Runner/AppDelegate.m",
|
||||||
"templates/app_shared/ios-objc.tmpl/Runner/main.m",
|
"templates/app_shared/ios-objc.tmpl/Runner/main.m",
|
||||||
"templates/app_shared/ios-objc.tmpl/RunnerTests/RunnerTests.m.tmpl",
|
"templates/app_shared/ios-objc.tmpl/RunnerTests/RunnerTests.m.tmpl",
|
||||||
"templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl",
|
"templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl",
|
||||||
"templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
|
"templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl",
|
||||||
"templates/app_shared/ios-swift.tmpl/Runner/AppDelegate.swift",
|
"templates/app_shared/ios-swift.tmpl/Runner/AppDelegate.swift",
|
||||||
"templates/app_shared/ios-swift.tmpl/Runner/Runner-Bridging-Header.h",
|
"templates/app_shared/ios-swift.tmpl/Runner/Runner-Bridging-Header.h",
|
||||||
"templates/app_shared/ios-swift.tmpl/RunnerTests/RunnerTests.swift.tmpl",
|
"templates/app_shared/ios-swift.tmpl/RunnerTests/RunnerTests.swift.tmpl",
|
||||||
|
@ -277,13 +277,9 @@
|
||||||
"templates/plugin/android.tmpl/gradle.properties.tmpl",
|
"templates/plugin/android.tmpl/gradle.properties.tmpl",
|
||||||
"templates/plugin/android.tmpl/settings.gradle.tmpl",
|
"templates/plugin/android.tmpl/settings.gradle.tmpl",
|
||||||
"templates/plugin/android.tmpl/src/main/AndroidManifest.xml.tmpl",
|
"templates/plugin/android.tmpl/src/main/AndroidManifest.xml.tmpl",
|
||||||
"templates/plugin/ios-objc.tmpl/Classes/pluginClass.h.tmpl",
|
|
||||||
"templates/plugin/ios-objc.tmpl/Classes/pluginClass.m.tmpl",
|
|
||||||
"templates/plugin/ios-objc.tmpl/projectName.podspec.tmpl",
|
"templates/plugin/ios-objc.tmpl/projectName.podspec.tmpl",
|
||||||
"templates/plugin/ios-swift.tmpl/Classes/pluginClass.swift.tmpl",
|
|
||||||
"templates/plugin/ios-swift.tmpl/projectName.podspec.tmpl",
|
"templates/plugin/ios-swift.tmpl/projectName.podspec.tmpl",
|
||||||
"templates/plugin/ios.tmpl/.gitignore",
|
"templates/plugin/ios.tmpl/.gitignore",
|
||||||
"templates/plugin/ios.tmpl/Assets/.gitkeep",
|
|
||||||
"templates/plugin/lib/projectName.dart.tmpl",
|
"templates/plugin/lib/projectName.dart.tmpl",
|
||||||
"templates/plugin/lib/projectName_platform_interface.dart.tmpl",
|
"templates/plugin/lib/projectName_platform_interface.dart.tmpl",
|
||||||
"templates/plugin/lib/projectName_method_channel.dart.tmpl",
|
"templates/plugin/lib/projectName_method_channel.dart.tmpl",
|
||||||
|
@ -292,7 +288,6 @@
|
||||||
"templates/plugin/linux.tmpl/pluginClassSnakeCase.cc.tmpl",
|
"templates/plugin/linux.tmpl/pluginClassSnakeCase.cc.tmpl",
|
||||||
"templates/plugin/linux.tmpl/pluginClassSnakeCase_private.h.tmpl",
|
"templates/plugin/linux.tmpl/pluginClassSnakeCase_private.h.tmpl",
|
||||||
"templates/plugin/linux.tmpl/test/pluginClassSnakeCase_test.cc.tmpl",
|
"templates/plugin/linux.tmpl/test/pluginClassSnakeCase_test.cc.tmpl",
|
||||||
"templates/plugin/macos.tmpl/Classes/pluginClass.swift.tmpl",
|
|
||||||
"templates/plugin/README.md.tmpl",
|
"templates/plugin/README.md.tmpl",
|
||||||
"templates/plugin/test/projectName_test.dart.tmpl",
|
"templates/plugin/test/projectName_test.dart.tmpl",
|
||||||
"templates/plugin/test/projectName_method_channel_test.dart.tmpl",
|
"templates/plugin/test/projectName_method_channel_test.dart.tmpl",
|
||||||
|
@ -338,6 +333,22 @@
|
||||||
"templates/plugin_shared/pubspec.yaml.tmpl",
|
"templates/plugin_shared/pubspec.yaml.tmpl",
|
||||||
"templates/plugin_shared/windows.tmpl/.gitignore",
|
"templates/plugin_shared/windows.tmpl/.gitignore",
|
||||||
|
|
||||||
|
"templates/plugin_cocoapods/ios-objc.tmpl/Classes/pluginClass.h.tmpl",
|
||||||
|
"templates/plugin_cocoapods/ios-objc.tmpl/Classes/pluginClass.m.tmpl",
|
||||||
|
"templates/plugin_cocoapods/ios-swift.tmpl/Classes/pluginClass.swift.tmpl",
|
||||||
|
"templates/plugin_cocoapods/ios.tmpl/Assets/.gitkeep",
|
||||||
|
"templates/plugin_cocoapods/macos.tmpl/Classes/pluginClass.swift.tmpl",
|
||||||
|
|
||||||
|
"templates/plugin_swift_package_manager/ios-objc.tmpl/projectName.tmpl/Sources/projectName.tmpl/include/projectName.tmpl/pluginClass.h.tmpl",
|
||||||
|
"templates/plugin_swift_package_manager/ios-objc.tmpl/projectName.tmpl/Sources/projectName.tmpl/pluginClass.m.tmpl",
|
||||||
|
"templates/plugin_swift_package_manager/ios-objc.tmpl/projectName.tmpl/Package.swift.tmpl",
|
||||||
|
"templates/plugin_swift_package_manager/ios-swift.tmpl/projectName.tmpl/Sources/projectName.tmpl/pluginClass.swift.tmpl",
|
||||||
|
"templates/plugin_swift_package_manager/ios-swift.tmpl/projectName.tmpl/Package.swift.tmpl",
|
||||||
|
"templates/plugin_swift_package_manager/ios.tmpl/projectName.tmpl/Sources/projectName.tmpl/Resources/.gitkeep",
|
||||||
|
"templates/plugin_swift_package_manager/macos.tmpl/projectName.tmpl/Sources/projectName.tmpl/Resources/.gitkeep",
|
||||||
|
"templates/plugin_swift_package_manager/macos.tmpl/projectName.tmpl/Sources/projectName.tmpl/pluginClass.swift.tmpl",
|
||||||
|
"templates/plugin_swift_package_manager/macos.tmpl/projectName.tmpl/Package.swift.tmpl",
|
||||||
|
|
||||||
"templates/skeleton/assets/images/2.0x/flutter_logo.png.img.tmpl",
|
"templates/skeleton/assets/images/2.0x/flutter_logo.png.img.tmpl",
|
||||||
"templates/skeleton/assets/images/3.0x/flutter_logo.png.img.tmpl",
|
"templates/skeleton/assets/images/3.0x/flutter_logo.png.img.tmpl",
|
||||||
"templates/skeleton/assets/images/flutter_logo.png.img.tmpl",
|
"templates/skeleton/assets/images/flutter_logo.png.img.tmpl",
|
||||||
|
|
|
@ -87,6 +87,7 @@ void main() {
|
||||||
globals.fs.path.join('flutter', 'packages', 'flutter_tools', 'templates', 'plugin'),
|
globals.fs.path.join('flutter', 'packages', 'flutter_tools', 'templates', 'plugin'),
|
||||||
globals.fs.path.join('flutter', 'packages', 'flutter_tools', 'templates', 'plugin_ffi'),
|
globals.fs.path.join('flutter', 'packages', 'flutter_tools', 'templates', 'plugin_ffi'),
|
||||||
globals.fs.path.join('flutter', 'packages', 'flutter_tools', 'templates', 'plugin_shared'),
|
globals.fs.path.join('flutter', 'packages', 'flutter_tools', 'templates', 'plugin_shared'),
|
||||||
|
globals.fs.path.join('flutter', 'packages', 'flutter_tools', 'templates', 'plugin_cocoapods'),
|
||||||
];
|
];
|
||||||
for (final String templatePath in templatePaths) {
|
for (final String templatePath in templatePaths) {
|
||||||
globals.fs.directory(templatePath).createSync(recursive: true);
|
globals.fs.directory(templatePath).createSync(recursive: true);
|
||||||
|
|
|
@ -718,6 +718,55 @@ void main() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testUsingContext('swift plugin project with Swift Package Manager', () async {
|
||||||
|
return _createProject(
|
||||||
|
projectDir,
|
||||||
|
<String>['--no-pub', '--template=plugin', '--ios-language', 'swift', '--platforms', 'ios,macos'],
|
||||||
|
<String>[
|
||||||
|
'ios/flutter_project/Package.swift',
|
||||||
|
'ios/flutter_project/Sources/flutter_project/FlutterProjectPlugin.swift',
|
||||||
|
'ios/flutter_project/Sources/flutter_project/Resources/.gitkeep',
|
||||||
|
'macos/flutter_project/Package.swift',
|
||||||
|
'macos/flutter_project/Sources/flutter_project/FlutterProjectPlugin.swift',
|
||||||
|
'macos/flutter_project/Sources/flutter_project/Resources/.gitkeep',
|
||||||
|
],
|
||||||
|
unexpectedPaths: <String>[
|
||||||
|
'ios/Classes/FlutterProjectPlugin.swift',
|
||||||
|
'macos/Classes/FlutterProjectPlugin.swift',
|
||||||
|
'ios/Classes/FlutterProjectPlugin.h',
|
||||||
|
'ios/Classes/FlutterProjectPlugin.m',
|
||||||
|
'ios/Assets/.gitkeep',
|
||||||
|
'macos/Assets/.gitkeep',
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
FeatureFlags: () => TestFeatureFlags(
|
||||||
|
isSwiftPackageManagerEnabled: true,
|
||||||
|
isMacOSEnabled: true,
|
||||||
|
),
|
||||||
|
});
|
||||||
|
|
||||||
|
testUsingContext('objc plugin project with Swift Package Manager', () async {
|
||||||
|
return _createProject(
|
||||||
|
projectDir,
|
||||||
|
<String>['--no-pub', '--template=plugin', '--ios-language', 'objc', '--platforms', 'ios'],
|
||||||
|
<String>[
|
||||||
|
'ios/flutter_project/Package.swift',
|
||||||
|
'ios/flutter_project/Sources/flutter_project/include/flutter_project/FlutterProjectPlugin.h',
|
||||||
|
'ios/flutter_project/Sources/flutter_project/FlutterProjectPlugin.m',
|
||||||
|
'ios/flutter_project/Sources/flutter_project/Resources/.gitkeep',
|
||||||
|
],
|
||||||
|
unexpectedPaths: <String>[
|
||||||
|
'ios/Classes/FlutterProjectPlugin.swift',
|
||||||
|
'ios/Classes/FlutterProjectPlugin.h',
|
||||||
|
'ios/Classes/FlutterProjectPlugin.m',
|
||||||
|
'ios/Assets/.gitkeep',
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
FeatureFlags: () => TestFeatureFlags(isSwiftPackageManagerEnabled: true),
|
||||||
|
});
|
||||||
|
|
||||||
testUsingContext('plugin project with custom org', () async {
|
testUsingContext('plugin project with custom org', () async {
|
||||||
return _createProject(
|
return _createProject(
|
||||||
projectDir,
|
projectDir,
|
||||||
|
|
|
@ -0,0 +1,151 @@
|
||||||
|
// 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 'package:flutter_tools/src/base/error_handling_io.dart';
|
||||||
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
|
|
||||||
|
import '../src/common.dart';
|
||||||
|
import 'swift_package_manager_utils.dart';
|
||||||
|
import 'test_utils.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
final String flutterBin = fileSystem.path.join(
|
||||||
|
getFlutterRoot(),
|
||||||
|
'bin',
|
||||||
|
'flutter',
|
||||||
|
);
|
||||||
|
|
||||||
|
final List<String> platforms = <String>['ios', 'macos'];
|
||||||
|
for (final String platformName in platforms) {
|
||||||
|
final List<String> iosLanguages = <String>[
|
||||||
|
if (platformName == 'ios') 'objc',
|
||||||
|
'swift',
|
||||||
|
];
|
||||||
|
|
||||||
|
for (final String iosLanguage in iosLanguages) {
|
||||||
|
test('Create $platformName $iosLanguage app with Swift Package Manager disabled', () async {
|
||||||
|
final Directory workingDirectory = fileSystem.systemTempDirectory
|
||||||
|
.createTempSync('swift_package_manager_create_app_disabled.');
|
||||||
|
final String workingDirectoryPath = workingDirectory.path;
|
||||||
|
try {
|
||||||
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
|
||||||
|
final String appDirectoryPath = await SwiftPackageManagerUtils.createApp(
|
||||||
|
flutterBin,
|
||||||
|
workingDirectoryPath,
|
||||||
|
iosLanguage: iosLanguage,
|
||||||
|
platform: platformName,
|
||||||
|
options: <String>['--platforms=$platformName'],
|
||||||
|
);
|
||||||
|
|
||||||
|
final File pbxprojFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childFile('project.pbxproj');
|
||||||
|
expect(pbxprojFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
pbxprojFile.readAsStringSync().contains('FlutterGeneratedPluginSwiftPackage'),
|
||||||
|
isFalse,
|
||||||
|
);
|
||||||
|
|
||||||
|
final File xcschemeFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childDirectory('xcshareddata')
|
||||||
|
.childDirectory('xcschemes')
|
||||||
|
.childFile('Runner.xcscheme');
|
||||||
|
expect(xcschemeFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
xcschemeFile.readAsStringSync().contains('Run Prepare Flutter Framework Script'),
|
||||||
|
isFalse,
|
||||||
|
);
|
||||||
|
|
||||||
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
|
flutterBin,
|
||||||
|
appDirectoryPath,
|
||||||
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
),
|
||||||
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
ErrorHandlingFileSystem.deleteIfExists(
|
||||||
|
workingDirectory,
|
||||||
|
recursive: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
||||||
|
|
||||||
|
test('Create $platformName $iosLanguage app with Swift Package Manager enabled', () async {
|
||||||
|
final Directory workingDirectory = fileSystem.systemTempDirectory
|
||||||
|
.createTempSync('swift_package_manager_create_app_enabled.');
|
||||||
|
final String workingDirectoryPath = workingDirectory.path;
|
||||||
|
try {
|
||||||
|
await SwiftPackageManagerUtils.enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
|
||||||
|
final String appDirectoryPath = await SwiftPackageManagerUtils.createApp(
|
||||||
|
flutterBin,
|
||||||
|
workingDirectoryPath,
|
||||||
|
iosLanguage: iosLanguage,
|
||||||
|
platform: platformName,
|
||||||
|
options: <String>['--platforms=$platformName'],
|
||||||
|
);
|
||||||
|
|
||||||
|
final File pbxprojFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childFile('project.pbxproj');
|
||||||
|
expect(pbxprojFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
pbxprojFile.readAsStringSync(),
|
||||||
|
contains('FlutterGeneratedPluginSwiftPackage'),
|
||||||
|
);
|
||||||
|
|
||||||
|
final File xcschemeFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childDirectory('xcshareddata')
|
||||||
|
.childDirectory('xcschemes')
|
||||||
|
.childFile('Runner.xcscheme');
|
||||||
|
expect(xcschemeFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
xcschemeFile.readAsStringSync(),
|
||||||
|
contains('Run Prepare Flutter Framework Script'),
|
||||||
|
);
|
||||||
|
|
||||||
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
|
flutterBin,
|
||||||
|
appDirectoryPath,
|
||||||
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
),
|
||||||
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
ErrorHandlingFileSystem.deleteIfExists(
|
||||||
|
workingDirectory,
|
||||||
|
recursive: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,175 @@
|
||||||
|
// 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 'package:flutter_tools/src/base/error_handling_io.dart';
|
||||||
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
|
|
||||||
|
import '../src/common.dart';
|
||||||
|
import 'swift_package_manager_utils.dart';
|
||||||
|
import 'test_utils.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
final String flutterBin = fileSystem.path.join(
|
||||||
|
getFlutterRoot(),
|
||||||
|
'bin',
|
||||||
|
'flutter',
|
||||||
|
);
|
||||||
|
|
||||||
|
final List<String> platforms = <String>['ios', 'macos'];
|
||||||
|
for (final String platformName in platforms) {
|
||||||
|
final List<String> iosLanguages = <String>[
|
||||||
|
if (platformName == 'ios') 'objc',
|
||||||
|
'swift',
|
||||||
|
];
|
||||||
|
|
||||||
|
for (final String iosLanguage in iosLanguages) {
|
||||||
|
test('Create $platformName $iosLanguage plugin with Swift Package Manager disabled', () async {
|
||||||
|
final Directory workingDirectory = fileSystem.systemTempDirectory
|
||||||
|
.createTempSync('swift_package_manager_create_plugin_disabled.');
|
||||||
|
final String workingDirectoryPath = workingDirectory.path;
|
||||||
|
try {
|
||||||
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
|
||||||
|
final SwiftPackageManagerPlugin createdCocoaPodsPlugin = await SwiftPackageManagerUtils.createPlugin(
|
||||||
|
flutterBin,
|
||||||
|
workingDirectoryPath,
|
||||||
|
platform: platformName,
|
||||||
|
iosLanguage: iosLanguage,
|
||||||
|
);
|
||||||
|
|
||||||
|
final String appDirectoryPath = createdCocoaPodsPlugin.exampleAppPath;
|
||||||
|
|
||||||
|
final File pbxprojFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childFile('project.pbxproj');
|
||||||
|
expect(pbxprojFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
pbxprojFile.readAsStringSync().contains('FlutterGeneratedPluginSwiftPackage'),
|
||||||
|
isFalse,
|
||||||
|
);
|
||||||
|
|
||||||
|
final File xcschemeFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childDirectory('xcshareddata')
|
||||||
|
.childDirectory('xcschemes')
|
||||||
|
.childFile('Runner.xcscheme');
|
||||||
|
expect(xcschemeFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
xcschemeFile.readAsStringSync().contains('Run Prepare Flutter Framework Script'),
|
||||||
|
isFalse,
|
||||||
|
);
|
||||||
|
|
||||||
|
final File podspec = fileSystem
|
||||||
|
.directory(createdCocoaPodsPlugin.pluginPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childFile('${createdCocoaPodsPlugin.pluginName}.podspec');
|
||||||
|
expect(podspec.existsSync(), isTrue);
|
||||||
|
expect(podspec.readAsStringSync(), contains('Classes'));
|
||||||
|
expect(podspec.readAsStringSync().contains('Sources'), isFalse);
|
||||||
|
|
||||||
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
|
flutterBin,
|
||||||
|
appDirectoryPath,
|
||||||
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
cocoaPodsPlugin: createdCocoaPodsPlugin,
|
||||||
|
),
|
||||||
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
cocoaPodsPlugin: createdCocoaPodsPlugin,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
ErrorHandlingFileSystem.deleteIfExists(
|
||||||
|
workingDirectory,
|
||||||
|
recursive: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
||||||
|
|
||||||
|
test('Create $platformName $iosLanguage plugin with Swift Package Manager enabled', () async {
|
||||||
|
final Directory workingDirectory = fileSystem.systemTempDirectory
|
||||||
|
.createTempSync('swift_package_manager_create_plugin_enabled.');
|
||||||
|
final String workingDirectoryPath = workingDirectory.path;
|
||||||
|
try {
|
||||||
|
await SwiftPackageManagerUtils.enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
|
||||||
|
final SwiftPackageManagerPlugin createdSwiftPackagePlugin = await SwiftPackageManagerUtils.createPlugin(
|
||||||
|
flutterBin,
|
||||||
|
workingDirectoryPath,
|
||||||
|
platform: platformName,
|
||||||
|
iosLanguage: iosLanguage,
|
||||||
|
);
|
||||||
|
|
||||||
|
final String appDirectoryPath = createdSwiftPackagePlugin.exampleAppPath;
|
||||||
|
|
||||||
|
final File pbxprojFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childFile('project.pbxproj');
|
||||||
|
expect(pbxprojFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
pbxprojFile.readAsStringSync(),
|
||||||
|
contains('FlutterGeneratedPluginSwiftPackage'),
|
||||||
|
);
|
||||||
|
|
||||||
|
final File xcschemeFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childDirectory('xcshareddata')
|
||||||
|
.childDirectory('xcschemes')
|
||||||
|
.childFile('Runner.xcscheme');
|
||||||
|
expect(xcschemeFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
xcschemeFile.readAsStringSync(),
|
||||||
|
contains('Run Prepare Flutter Framework Script'),
|
||||||
|
);
|
||||||
|
|
||||||
|
final File podspec = fileSystem
|
||||||
|
.directory(createdSwiftPackagePlugin.pluginPath)
|
||||||
|
.childDirectory(platformName)
|
||||||
|
.childFile('${createdSwiftPackagePlugin.pluginName}.podspec');
|
||||||
|
expect(podspec.existsSync(), isTrue);
|
||||||
|
expect(podspec.readAsStringSync(), contains('Sources'));
|
||||||
|
expect(podspec.readAsStringSync().contains('Classes'), isFalse);
|
||||||
|
|
||||||
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
|
flutterBin,
|
||||||
|
appDirectoryPath,
|
||||||
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
swiftPackagePlugin: createdSwiftPackagePlugin,
|
||||||
|
swiftPackageMangerEnabled: true,
|
||||||
|
),
|
||||||
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
|
platform: platformName,
|
||||||
|
appDirectoryPath: appDirectoryPath,
|
||||||
|
swiftPackagePlugin: createdSwiftPackagePlugin,
|
||||||
|
swiftPackageMangerEnabled: true,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
ErrorHandlingFileSystem.deleteIfExists(
|
||||||
|
workingDirectory,
|
||||||
|
recursive: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,13 +2,11 @@
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
import 'package:flutter_tools/src/base/error_handling_io.dart';
|
import 'package:flutter_tools/src/base/error_handling_io.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
import 'package:flutter_tools/src/base/io.dart';
|
|
||||||
|
|
||||||
import '../src/common.dart';
|
import '../src/common.dart';
|
||||||
|
import 'swift_package_manager_utils.dart';
|
||||||
import 'test_utils.dart';
|
import 'test_utils.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
@ -24,39 +22,36 @@ void main() {
|
||||||
if (platformName == 'ios') 'objc',
|
if (platformName == 'ios') 'objc',
|
||||||
'swift',
|
'swift',
|
||||||
];
|
];
|
||||||
final _Plugin integrationTestPlugin = _integrationTestPlugin(platformName);
|
final SwiftPackageManagerPlugin integrationTestPlugin = SwiftPackageManagerUtils.integrationTestPlugin(platformName);
|
||||||
|
|
||||||
for (final String iosLanguage in iosLanguages) {
|
for (final String iosLanguage in iosLanguages) {
|
||||||
test('Swift Package Manager not used when feature is disabled for $platformName with $iosLanguage', () async {
|
test('Swift Package Manager integration for $platformName with $iosLanguage', () async {
|
||||||
final Directory workingDirectory = fileSystem.systemTempDirectory
|
final Directory workingDirectory = fileSystem.systemTempDirectory
|
||||||
.createTempSync('swift_package_manager_disabled.');
|
.createTempSync('swift_package_manager_enabled.');
|
||||||
final String workingDirectoryPath = workingDirectory.path;
|
final String workingDirectoryPath = workingDirectory.path;
|
||||||
try {
|
try {
|
||||||
await _disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
|
||||||
|
|
||||||
// Create and build an app using the CocoaPods version of
|
// Create and build an app using the CocoaPods version of
|
||||||
// integration_test.
|
// integration_test.
|
||||||
final String appDirectoryPath = await _createApp(
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
final String appDirectoryPath = await SwiftPackageManagerUtils.createApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
workingDirectoryPath,
|
workingDirectoryPath,
|
||||||
iosLanguage: iosLanguage,
|
iosLanguage: iosLanguage,
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
|
usesSwiftPackageManager: true,
|
||||||
options: <String>['--platforms=$platformName'],
|
options: <String>['--platforms=$platformName'],
|
||||||
);
|
);
|
||||||
_addDependency(
|
SwiftPackageManagerUtils.addDependency(appDirectoryPath: appDirectoryPath, plugin: integrationTestPlugin);
|
||||||
appDirectoryPath: appDirectoryPath,
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
plugin: integrationTestPlugin,
|
|
||||||
);
|
|
||||||
await _buildApp(
|
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[platformName, '--debug', '-v'],
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
expectedLines: _expectedLines(
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: integrationTestPlugin,
|
cocoaPodsPlugin: integrationTestPlugin,
|
||||||
),
|
),
|
||||||
unexpectedLines: _unexpectedLines(
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: integrationTestPlugin,
|
cocoaPodsPlugin: integrationTestPlugin,
|
||||||
|
@ -81,47 +76,34 @@ void main() {
|
||||||
.existsSync(),
|
.existsSync(),
|
||||||
isFalse,
|
isFalse,
|
||||||
);
|
);
|
||||||
} finally {
|
|
||||||
ErrorHandlingFileSystem.deleteIfExists(
|
|
||||||
workingDirectory,
|
|
||||||
recursive: true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
|
||||||
|
|
||||||
test('Swift Package Manager integration for $platformName with $iosLanguage', () async {
|
final SwiftPackageManagerPlugin createdCocoaPodsPlugin = await SwiftPackageManagerUtils.createPlugin(
|
||||||
final Directory workingDirectory = fileSystem.systemTempDirectory
|
|
||||||
.createTempSync('swift_package_manager_enabled.');
|
|
||||||
final String workingDirectoryPath = workingDirectory.path;
|
|
||||||
try {
|
|
||||||
// Create and build an app using the Swift Package Manager version of
|
|
||||||
// integration_test.
|
|
||||||
await _enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
|
||||||
|
|
||||||
final String appDirectoryPath = await _createApp(
|
|
||||||
flutterBin,
|
flutterBin,
|
||||||
workingDirectoryPath,
|
workingDirectoryPath,
|
||||||
iosLanguage: iosLanguage,
|
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
usesSwiftPackageManager: true,
|
iosLanguage: iosLanguage,
|
||||||
options: <String>['--platforms=$platformName'],
|
|
||||||
);
|
);
|
||||||
_addDependency(appDirectoryPath: appDirectoryPath, plugin: integrationTestPlugin);
|
|
||||||
await _buildApp(
|
// Rebuild app with Swift Package Manager enabled, migrating the app and using the Swift Package Manager version of
|
||||||
|
// integration_test.
|
||||||
|
await SwiftPackageManagerUtils.enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[platformName, '--debug', '-v'],
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
expectedLines: _expectedLines(
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
swiftPackageMangerEnabled: true,
|
swiftPackageMangerEnabled: true,
|
||||||
swiftPackagePlugin: integrationTestPlugin,
|
swiftPackagePlugin: integrationTestPlugin,
|
||||||
|
migrated: true,
|
||||||
),
|
),
|
||||||
unexpectedLines: _unexpectedLines(
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
swiftPackageMangerEnabled: true,
|
swiftPackageMangerEnabled: true,
|
||||||
swiftPackagePlugin: integrationTestPlugin,
|
swiftPackagePlugin: integrationTestPlugin,
|
||||||
|
migrated: true,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -131,7 +113,7 @@ void main() {
|
||||||
.childDirectory(platformName)
|
.childDirectory(platformName)
|
||||||
.childFile('Podfile')
|
.childFile('Podfile')
|
||||||
.existsSync(),
|
.existsSync(),
|
||||||
isFalse,
|
isTrue,
|
||||||
);
|
);
|
||||||
expect(
|
expect(
|
||||||
fileSystem
|
fileSystem
|
||||||
|
@ -146,29 +128,22 @@ void main() {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Build an app using both a CocoaPods and Swift Package Manager plugin.
|
// Build an app using both a CocoaPods and Swift Package Manager plugin.
|
||||||
await _cleanApp(flutterBin, appDirectoryPath);
|
SwiftPackageManagerUtils.addDependency(
|
||||||
final _Plugin createdCocoaPodsPlugin = await _createPlugin(
|
|
||||||
flutterBin,
|
|
||||||
workingDirectoryPath,
|
|
||||||
platform: platformName,
|
|
||||||
iosLanguage: iosLanguage,
|
|
||||||
);
|
|
||||||
_addDependency(
|
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
plugin: createdCocoaPodsPlugin,
|
plugin: createdCocoaPodsPlugin,
|
||||||
);
|
);
|
||||||
await _buildApp(
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[platformName, '--debug', '-v'],
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
expectedLines: _expectedLines(
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: createdCocoaPodsPlugin,
|
cocoaPodsPlugin: createdCocoaPodsPlugin,
|
||||||
swiftPackageMangerEnabled: true,
|
swiftPackageMangerEnabled: true,
|
||||||
swiftPackagePlugin: integrationTestPlugin,
|
swiftPackagePlugin: integrationTestPlugin,
|
||||||
),
|
),
|
||||||
unexpectedLines: _unexpectedLines(
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: createdCocoaPodsPlugin,
|
cocoaPodsPlugin: createdCocoaPodsPlugin,
|
||||||
|
@ -199,18 +174,18 @@ void main() {
|
||||||
|
|
||||||
// Build app again but with Swift Package Manager disabled by config.
|
// Build app again but with Swift Package Manager disabled by config.
|
||||||
// App will now use CocoaPods version of integration_test plugin.
|
// App will now use CocoaPods version of integration_test plugin.
|
||||||
await _disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
await _cleanApp(flutterBin, appDirectoryPath);
|
await SwiftPackageManagerUtils.cleanApp(flutterBin, appDirectoryPath);
|
||||||
await _buildApp(
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[platformName, '--debug', '-v'],
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
expectedLines: _expectedLines(
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: integrationTestPlugin,
|
cocoaPodsPlugin: integrationTestPlugin,
|
||||||
),
|
),
|
||||||
unexpectedLines: _unexpectedLines(
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: integrationTestPlugin,
|
cocoaPodsPlugin: integrationTestPlugin,
|
||||||
|
@ -219,26 +194,26 @@ void main() {
|
||||||
|
|
||||||
// Build app again but with Swift Package Manager disabled by pubspec.
|
// Build app again but with Swift Package Manager disabled by pubspec.
|
||||||
// App will still use CocoaPods version of integration_test plugin.
|
// App will still use CocoaPods version of integration_test plugin.
|
||||||
await _enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
await SwiftPackageManagerUtils.enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
await _cleanApp(flutterBin, appDirectoryPath);
|
await SwiftPackageManagerUtils.cleanApp(flutterBin, appDirectoryPath);
|
||||||
_disableSwiftPackageManagerByPubspec(appDirectoryPath: appDirectoryPath);
|
SwiftPackageManagerUtils.disableSwiftPackageManagerByPubspec(appDirectoryPath: appDirectoryPath);
|
||||||
await _buildApp(
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[platformName, '--debug', '-v'],
|
options: <String>[platformName, '--debug', '-v'],
|
||||||
expectedLines: _expectedLines(
|
expectedLines: SwiftPackageManagerUtils.expectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: integrationTestPlugin,
|
cocoaPodsPlugin: integrationTestPlugin,
|
||||||
),
|
),
|
||||||
unexpectedLines: _unexpectedLines(
|
unexpectedLines: SwiftPackageManagerUtils.unexpectedLines(
|
||||||
platform: platformName,
|
platform: platformName,
|
||||||
appDirectoryPath: appDirectoryPath,
|
appDirectoryPath: appDirectoryPath,
|
||||||
cocoaPodsPlugin: integrationTestPlugin,
|
cocoaPodsPlugin: integrationTestPlugin,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} finally {
|
} finally {
|
||||||
await _disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
ErrorHandlingFileSystem.deleteIfExists(
|
ErrorHandlingFileSystem.deleteIfExists(
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
recursive: true,
|
recursive: true,
|
||||||
|
@ -254,9 +229,9 @@ void main() {
|
||||||
try {
|
try {
|
||||||
// Create and build an app using the Swift Package Manager version of
|
// Create and build an app using the Swift Package Manager version of
|
||||||
// integration_test.
|
// integration_test.
|
||||||
await _enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
await SwiftPackageManagerUtils.enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
|
||||||
final String appDirectoryPath = await _createApp(
|
final String appDirectoryPath = await SwiftPackageManagerUtils.createApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
workingDirectoryPath,
|
workingDirectoryPath,
|
||||||
iosLanguage: 'swift',
|
iosLanguage: 'swift',
|
||||||
|
@ -264,15 +239,12 @@ void main() {
|
||||||
usesSwiftPackageManager: true,
|
usesSwiftPackageManager: true,
|
||||||
options: <String>['--platforms=$platformName'],
|
options: <String>['--platforms=$platformName'],
|
||||||
);
|
);
|
||||||
_addDependency(appDirectoryPath: appDirectoryPath, plugin: integrationTestPlugin);
|
SwiftPackageManagerUtils.addDependency(appDirectoryPath: appDirectoryPath, plugin: integrationTestPlugin);
|
||||||
|
|
||||||
await _buildApp(
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[platformName, '--config-only', '-v'],
|
options: <String>[platformName, '--config-only', '-v'],
|
||||||
expectedLines: <String>[
|
|
||||||
'Adding Swift Package Manager integration...'
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
|
@ -297,7 +269,7 @@ void main() {
|
||||||
|
|
||||||
// Create and build framework using the CocoaPods version of
|
// Create and build framework using the CocoaPods version of
|
||||||
// integration_test even though Swift Package Manager is enabled.
|
// integration_test even though Swift Package Manager is enabled.
|
||||||
await _buildApp(
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[
|
options: <String>[
|
||||||
|
@ -323,7 +295,7 @@ void main() {
|
||||||
isTrue,
|
isTrue,
|
||||||
);
|
);
|
||||||
} finally {
|
} finally {
|
||||||
await _disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
ErrorHandlingFileSystem.deleteIfExists(
|
ErrorHandlingFileSystem.deleteIfExists(
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
recursive: true,
|
recursive: true,
|
||||||
|
@ -339,9 +311,9 @@ void main() {
|
||||||
try {
|
try {
|
||||||
// Create and build module and framework using the CocoaPods version of
|
// Create and build module and framework using the CocoaPods version of
|
||||||
// integration_test even though Swift Package Manager is enabled.
|
// integration_test even though Swift Package Manager is enabled.
|
||||||
await _enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
await SwiftPackageManagerUtils.enableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
|
|
||||||
final String appDirectoryPath = await _createApp(
|
final String appDirectoryPath = await SwiftPackageManagerUtils.createApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
workingDirectoryPath,
|
workingDirectoryPath,
|
||||||
iosLanguage: 'swift',
|
iosLanguage: 'swift',
|
||||||
|
@ -349,16 +321,13 @@ void main() {
|
||||||
usesSwiftPackageManager: true,
|
usesSwiftPackageManager: true,
|
||||||
options: <String>['--template=module'],
|
options: <String>['--template=module'],
|
||||||
);
|
);
|
||||||
final _Plugin integrationTestPlugin = _integrationTestPlugin('ios');
|
final SwiftPackageManagerPlugin integrationTestPlugin = SwiftPackageManagerUtils.integrationTestPlugin('ios');
|
||||||
_addDependency(appDirectoryPath: appDirectoryPath, plugin: integrationTestPlugin);
|
SwiftPackageManagerUtils.addDependency(appDirectoryPath: appDirectoryPath, plugin: integrationTestPlugin);
|
||||||
|
|
||||||
await _buildApp(
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>['ios', '--config-only', '-v'],
|
options: <String>['ios', '--config-only', '-v'],
|
||||||
unexpectedLines: <String>[
|
|
||||||
'Adding Swift Package Manager integration...'
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
|
@ -380,8 +349,30 @@ void main() {
|
||||||
.existsSync(),
|
.existsSync(),
|
||||||
isFalse,
|
isFalse,
|
||||||
);
|
);
|
||||||
|
final File pbxprojFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory('.ios')
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childFile('project.pbxproj');
|
||||||
|
expect(pbxprojFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
pbxprojFile.readAsStringSync().contains('FlutterGeneratedPluginSwiftPackage'),
|
||||||
|
isFalse,
|
||||||
|
);
|
||||||
|
final File xcschemeFile = fileSystem
|
||||||
|
.directory(appDirectoryPath)
|
||||||
|
.childDirectory('.ios')
|
||||||
|
.childDirectory('Runner.xcodeproj')
|
||||||
|
.childDirectory('xcshareddata')
|
||||||
|
.childDirectory('xcschemes')
|
||||||
|
.childFile('Runner.xcscheme');
|
||||||
|
expect(xcschemeFile.existsSync(), isTrue);
|
||||||
|
expect(
|
||||||
|
xcschemeFile.readAsStringSync().contains('Run Prepare Flutter Framework Script'),
|
||||||
|
isFalse,
|
||||||
|
);
|
||||||
|
|
||||||
await _buildApp(
|
await SwiftPackageManagerUtils.buildApp(
|
||||||
flutterBin,
|
flutterBin,
|
||||||
appDirectoryPath,
|
appDirectoryPath,
|
||||||
options: <String>[
|
options: <String>[
|
||||||
|
@ -408,7 +399,7 @@ void main() {
|
||||||
isTrue,
|
isTrue,
|
||||||
);
|
);
|
||||||
} finally {
|
} finally {
|
||||||
await _disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
await SwiftPackageManagerUtils.disableSwiftPackageManager(flutterBin, workingDirectoryPath);
|
||||||
ErrorHandlingFileSystem.deleteIfExists(
|
ErrorHandlingFileSystem.deleteIfExists(
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
recursive: true,
|
recursive: true,
|
||||||
|
@ -416,355 +407,3 @@ void main() {
|
||||||
}
|
}
|
||||||
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
}, skip: !platform.isMacOS); // [intended] Swift Package Manager only works on macos.
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _enableSwiftPackageManager(
|
|
||||||
String flutterBin,
|
|
||||||
String workingDirectory,
|
|
||||||
) async {
|
|
||||||
final ProcessResult result = await processManager.run(
|
|
||||||
<String>[
|
|
||||||
flutterBin,
|
|
||||||
...getLocalEngineArguments(),
|
|
||||||
'config',
|
|
||||||
'--enable-swift-package-manager',
|
|
||||||
'-v',
|
|
||||||
],
|
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
result.exitCode,
|
|
||||||
0,
|
|
||||||
reason: 'Failed to enable Swift Package Manager: \n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
verbose: true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _disableSwiftPackageManager(
|
|
||||||
String flutterBin,
|
|
||||||
String workingDirectory,
|
|
||||||
) async {
|
|
||||||
final ProcessResult result = await processManager.run(
|
|
||||||
<String>[
|
|
||||||
flutterBin,
|
|
||||||
...getLocalEngineArguments(),
|
|
||||||
'config',
|
|
||||||
'--no-enable-swift-package-manager',
|
|
||||||
'-v',
|
|
||||||
],
|
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
result.exitCode,
|
|
||||||
0,
|
|
||||||
reason: 'Failed to disable Swift Package Manager: \n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
verbose: true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String> _createApp(
|
|
||||||
String flutterBin,
|
|
||||||
String workingDirectory, {
|
|
||||||
required String platform,
|
|
||||||
required String iosLanguage,
|
|
||||||
required List<String> options,
|
|
||||||
bool usesSwiftPackageManager = false,
|
|
||||||
}) async {
|
|
||||||
final String appTemplateType = usesSwiftPackageManager ? 'spm' : 'default';
|
|
||||||
|
|
||||||
final String appName = '${platform}_${iosLanguage}_${appTemplateType}_app';
|
|
||||||
final ProcessResult result = await processManager.run(
|
|
||||||
<String>[
|
|
||||||
flutterBin,
|
|
||||||
...getLocalEngineArguments(),
|
|
||||||
'create',
|
|
||||||
'--org',
|
|
||||||
'io.flutter.devicelab',
|
|
||||||
'-i',
|
|
||||||
iosLanguage,
|
|
||||||
...options,
|
|
||||||
appName,
|
|
||||||
],
|
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
|
||||||
result.exitCode,
|
|
||||||
0,
|
|
||||||
reason: 'Failed to create app: \n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
);
|
|
||||||
|
|
||||||
return fileSystem.path.join(
|
|
||||||
workingDirectory,
|
|
||||||
appName,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _buildApp(
|
|
||||||
String flutterBin,
|
|
||||||
String workingDirectory, {
|
|
||||||
required List<String> options,
|
|
||||||
List<Pattern>? expectedLines,
|
|
||||||
List<String>? unexpectedLines,
|
|
||||||
}) async {
|
|
||||||
final List<Pattern> remainingExpectedLines = expectedLines ?? <Pattern>[];
|
|
||||||
final List<String> unexpectedLinesFound = <String>[];
|
|
||||||
final List<String> command = <String>[
|
|
||||||
flutterBin,
|
|
||||||
...getLocalEngineArguments(),
|
|
||||||
'build',
|
|
||||||
...options,
|
|
||||||
];
|
|
||||||
|
|
||||||
final ProcessResult result = await processManager.run(
|
|
||||||
command,
|
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
);
|
|
||||||
|
|
||||||
final List<String> stdout = LineSplitter.split(result.stdout.toString()).toList();
|
|
||||||
final List<String> stderr = LineSplitter.split(result.stderr.toString()).toList();
|
|
||||||
final List<String> output = stdout + stderr;
|
|
||||||
for (final String line in output) {
|
|
||||||
// Remove "[ +3 ms] " prefix
|
|
||||||
String trimmedLine = line.trim();
|
|
||||||
if (trimmedLine.startsWith('[')) {
|
|
||||||
final int prefixEndIndex = trimmedLine.indexOf(']');
|
|
||||||
if (prefixEndIndex > 0) {
|
|
||||||
trimmedLine = trimmedLine
|
|
||||||
.substring(prefixEndIndex + 1, trimmedLine.length)
|
|
||||||
.trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
remainingExpectedLines.remove(trimmedLine);
|
|
||||||
remainingExpectedLines.removeWhere((Pattern expectedLine) => trimmedLine.contains(expectedLine));
|
|
||||||
if (unexpectedLines != null && unexpectedLines.contains(trimmedLine)) {
|
|
||||||
unexpectedLinesFound.add(trimmedLine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect(
|
|
||||||
result.exitCode,
|
|
||||||
0,
|
|
||||||
reason: 'Failed to build app for "${command.join(' ')}":\n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
remainingExpectedLines,
|
|
||||||
isEmpty,
|
|
||||||
reason: 'Did not find expected lines for "${command.join(' ')}":\n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
unexpectedLinesFound,
|
|
||||||
isEmpty,
|
|
||||||
reason: 'Found unexpected lines for "${command.join(' ')}":\n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _cleanApp(String flutterBin, String workingDirectory) async {
|
|
||||||
final ProcessResult result = await processManager.run(
|
|
||||||
<String>[
|
|
||||||
flutterBin,
|
|
||||||
...getLocalEngineArguments(),
|
|
||||||
'clean',
|
|
||||||
],
|
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
);
|
|
||||||
expect(
|
|
||||||
result.exitCode,
|
|
||||||
0,
|
|
||||||
reason: 'Failed to clean app: \n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<_Plugin> _createPlugin(
|
|
||||||
String flutterBin,
|
|
||||||
String workingDirectory, {
|
|
||||||
required String platform,
|
|
||||||
required String iosLanguage,
|
|
||||||
bool usesSwiftPackageManager = false,
|
|
||||||
}) async {
|
|
||||||
final String dependencyManager = usesSwiftPackageManager ? 'spm' : 'cocoapods';
|
|
||||||
|
|
||||||
// Create plugin
|
|
||||||
final String pluginName = '${platform}_${iosLanguage}_${dependencyManager}_plugin';
|
|
||||||
final ProcessResult result = await processManager.run(
|
|
||||||
<String>[
|
|
||||||
flutterBin,
|
|
||||||
...getLocalEngineArguments(),
|
|
||||||
'create',
|
|
||||||
'--org',
|
|
||||||
'io.flutter.devicelab',
|
|
||||||
'--template=plugin',
|
|
||||||
'--platforms=$platform',
|
|
||||||
'-i',
|
|
||||||
iosLanguage,
|
|
||||||
pluginName,
|
|
||||||
],
|
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(
|
|
||||||
result.exitCode,
|
|
||||||
0,
|
|
||||||
reason: 'Failed to create plugin: \n'
|
|
||||||
'stdout: \n${result.stdout}\n'
|
|
||||||
'stderr: \n${result.stderr}\n',
|
|
||||||
);
|
|
||||||
|
|
||||||
final Directory pluginDirectory = fileSystem.directory(
|
|
||||||
fileSystem.path.join(workingDirectory, pluginName),
|
|
||||||
);
|
|
||||||
|
|
||||||
return _Plugin(
|
|
||||||
pluginName: pluginName,
|
|
||||||
pluginPath: pluginDirectory.path,
|
|
||||||
platform: platform,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _addDependency({
|
|
||||||
required _Plugin plugin,
|
|
||||||
required String appDirectoryPath,
|
|
||||||
}) {
|
|
||||||
final File pubspec = fileSystem.file(
|
|
||||||
fileSystem.path.join(appDirectoryPath, 'pubspec.yaml'),
|
|
||||||
);
|
|
||||||
final String pubspecContent = pubspec.readAsStringSync();
|
|
||||||
pubspec.writeAsStringSync(
|
|
||||||
pubspecContent.replaceFirst(
|
|
||||||
'\ndependencies:\n',
|
|
||||||
'\ndependencies:\n ${plugin.pluginName}:\n path: ${plugin.pluginPath}\n',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _disableSwiftPackageManagerByPubspec({
|
|
||||||
required String appDirectoryPath,
|
|
||||||
}) {
|
|
||||||
final File pubspec = fileSystem.file(
|
|
||||||
fileSystem.path.join(appDirectoryPath, 'pubspec.yaml'),
|
|
||||||
);
|
|
||||||
final String pubspecContent = pubspec.readAsStringSync();
|
|
||||||
pubspec.writeAsStringSync(
|
|
||||||
pubspecContent.replaceFirst(
|
|
||||||
'\n# The following section is specific to Flutter packages.\nflutter:\n',
|
|
||||||
'\n# The following section is specific to Flutter packages.\nflutter:\n disable-swift-package-manager: true',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_Plugin _integrationTestPlugin(String platform) {
|
|
||||||
final String flutterRoot = getFlutterRoot();
|
|
||||||
return _Plugin(
|
|
||||||
platform: platform,
|
|
||||||
pluginName:
|
|
||||||
(platform == 'ios') ? 'integration_test' : 'integration_test_macos',
|
|
||||||
pluginPath: (platform == 'ios')
|
|
||||||
? fileSystem.path.join(flutterRoot, 'packages', 'integration_test')
|
|
||||||
: fileSystem.path.join(flutterRoot, 'packages', 'integration_test', 'integration_test_macos'),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Pattern> _expectedLines({
|
|
||||||
required String platform,
|
|
||||||
required String appDirectoryPath,
|
|
||||||
_Plugin? cocoaPodsPlugin,
|
|
||||||
_Plugin? swiftPackagePlugin,
|
|
||||||
bool swiftPackageMangerEnabled = false,
|
|
||||||
}) {
|
|
||||||
final String frameworkName = platform == 'ios' ? 'Flutter' : 'FlutterMacOS';
|
|
||||||
final String appPlatformDirectoryPath = fileSystem.path.join(
|
|
||||||
appDirectoryPath,
|
|
||||||
platform,
|
|
||||||
);
|
|
||||||
|
|
||||||
final List<Pattern> expectedLines = <Pattern>[];
|
|
||||||
if (swiftPackageMangerEnabled) {
|
|
||||||
expectedLines.addAll(<String>[
|
|
||||||
'FlutterGeneratedPluginSwiftPackage: $appPlatformDirectoryPath/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage',
|
|
||||||
"➜ Explicit dependency on target 'FlutterGeneratedPluginSwiftPackage' in project 'FlutterGeneratedPluginSwiftPackage'",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
if (swiftPackagePlugin != null) {
|
|
||||||
// If using a Swift Package plugin, but Swift Package Manager is not enabled, it falls back to being used as a CocoaPods plugin.
|
|
||||||
if (swiftPackageMangerEnabled) {
|
|
||||||
expectedLines.addAll(<Pattern>[
|
|
||||||
RegExp('${swiftPackagePlugin.pluginName}: [/private]*${swiftPackagePlugin.pluginPath}/$platform/${swiftPackagePlugin.pluginName} @ local'),
|
|
||||||
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project '${swiftPackagePlugin.pluginName}'",
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
expectedLines.addAll(<String>[
|
|
||||||
'-> Installing ${swiftPackagePlugin.pluginName} (0.0.1)',
|
|
||||||
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project 'Pods'",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cocoaPodsPlugin != null) {
|
|
||||||
expectedLines.addAll(<String>[
|
|
||||||
'Running pod install...',
|
|
||||||
'-> Installing $frameworkName (1.0.0)',
|
|
||||||
'-> Installing ${cocoaPodsPlugin.pluginName} (0.0.1)',
|
|
||||||
"Target 'Pods-Runner' in project 'Pods'",
|
|
||||||
"➜ Explicit dependency on target '$frameworkName' in project 'Pods'",
|
|
||||||
"➜ Explicit dependency on target '${cocoaPodsPlugin.pluginName}' in project 'Pods'",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
return expectedLines;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> _unexpectedLines({
|
|
||||||
required String platform,
|
|
||||||
required String appDirectoryPath,
|
|
||||||
_Plugin? cocoaPodsPlugin,
|
|
||||||
_Plugin? swiftPackagePlugin,
|
|
||||||
bool swiftPackageMangerEnabled = false,
|
|
||||||
}) {
|
|
||||||
final String frameworkName = platform == 'ios' ? 'Flutter' : 'FlutterMacOS';
|
|
||||||
final List<String> unexpectedLines = <String>[];
|
|
||||||
if (cocoaPodsPlugin == null) {
|
|
||||||
unexpectedLines.addAll(<String>[
|
|
||||||
'Running pod install...',
|
|
||||||
'-> Installing $frameworkName (1.0.0)',
|
|
||||||
"Target 'Pods-Runner' in project 'Pods'",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
if (swiftPackagePlugin != null) {
|
|
||||||
if (swiftPackageMangerEnabled) {
|
|
||||||
unexpectedLines.addAll(<String>[
|
|
||||||
'-> Installing ${swiftPackagePlugin.pluginName} (0.0.1)',
|
|
||||||
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project 'Pods'",
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
unexpectedLines.addAll(<String>[
|
|
||||||
'${swiftPackagePlugin.pluginName}: ${swiftPackagePlugin.pluginPath}/$platform/${swiftPackagePlugin.pluginName} @ local',
|
|
||||||
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project '${swiftPackagePlugin.pluginName}'",
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return unexpectedLines;
|
|
||||||
}
|
|
||||||
|
|
||||||
class _Plugin {
|
|
||||||
_Plugin({
|
|
||||||
required this.pluginName,
|
|
||||||
required this.pluginPath,
|
|
||||||
required this.platform,
|
|
||||||
});
|
|
||||||
|
|
||||||
final String pluginName;
|
|
||||||
final String pluginPath;
|
|
||||||
final String platform;
|
|
||||||
String get exampleAppPath => fileSystem.path.join(pluginPath, 'example');
|
|
||||||
String get exampleAppPlatformPath => fileSystem.path.join(exampleAppPath, platform);
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,379 @@
|
||||||
|
// 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 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
|
import 'package:flutter_tools/src/base/io.dart';
|
||||||
|
|
||||||
|
import '../src/common.dart';
|
||||||
|
import 'test_utils.dart';
|
||||||
|
|
||||||
|
class SwiftPackageManagerUtils {
|
||||||
|
static Future<void> enableSwiftPackageManager(
|
||||||
|
String flutterBin,
|
||||||
|
String workingDirectory,
|
||||||
|
) async {
|
||||||
|
final ProcessResult result = await processManager.run(
|
||||||
|
<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'config',
|
||||||
|
'--enable-swift-package-manager',
|
||||||
|
'-v',
|
||||||
|
],
|
||||||
|
workingDirectory: workingDirectory,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
result.exitCode,
|
||||||
|
0,
|
||||||
|
reason: 'Failed to enable Swift Package Manager: \n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
verbose: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> disableSwiftPackageManager(
|
||||||
|
String flutterBin,
|
||||||
|
String workingDirectory,
|
||||||
|
) async {
|
||||||
|
final ProcessResult result = await processManager.run(
|
||||||
|
<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'config',
|
||||||
|
'--no-enable-swift-package-manager',
|
||||||
|
'-v',
|
||||||
|
],
|
||||||
|
workingDirectory: workingDirectory,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
result.exitCode,
|
||||||
|
0,
|
||||||
|
reason: 'Failed to disable Swift Package Manager: \n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
verbose: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<String> createApp(
|
||||||
|
String flutterBin,
|
||||||
|
String workingDirectory, {
|
||||||
|
required String platform,
|
||||||
|
required String iosLanguage,
|
||||||
|
required List<String> options,
|
||||||
|
bool usesSwiftPackageManager = false,
|
||||||
|
}) async {
|
||||||
|
final String appTemplateType = usesSwiftPackageManager ? 'spm' : 'default';
|
||||||
|
|
||||||
|
final String appName = '${platform}_${iosLanguage}_${appTemplateType}_app';
|
||||||
|
final ProcessResult result = await processManager.run(
|
||||||
|
<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'create',
|
||||||
|
'--org',
|
||||||
|
'io.flutter.devicelab',
|
||||||
|
'-i',
|
||||||
|
iosLanguage,
|
||||||
|
...options,
|
||||||
|
appName,
|
||||||
|
],
|
||||||
|
workingDirectory: workingDirectory,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
result.exitCode,
|
||||||
|
0,
|
||||||
|
reason: 'Failed to create app: \n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
);
|
||||||
|
|
||||||
|
return fileSystem.path.join(
|
||||||
|
workingDirectory,
|
||||||
|
appName,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> buildApp(
|
||||||
|
String flutterBin,
|
||||||
|
String workingDirectory, {
|
||||||
|
required List<String> options,
|
||||||
|
List<Pattern>? expectedLines,
|
||||||
|
List<String>? unexpectedLines,
|
||||||
|
}) async {
|
||||||
|
final List<Pattern> remainingExpectedLines = expectedLines ?? <Pattern>[];
|
||||||
|
final List<String> unexpectedLinesFound = <String>[];
|
||||||
|
final List<String> command = <String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'build',
|
||||||
|
...options,
|
||||||
|
];
|
||||||
|
|
||||||
|
final ProcessResult result = await processManager.run(
|
||||||
|
command,
|
||||||
|
workingDirectory: workingDirectory,
|
||||||
|
);
|
||||||
|
|
||||||
|
final List<String> stdout = LineSplitter.split(result.stdout.toString()).toList();
|
||||||
|
final List<String> stderr = LineSplitter.split(result.stderr.toString()).toList();
|
||||||
|
final List<String> output = stdout + stderr;
|
||||||
|
for (final String line in output) {
|
||||||
|
// Remove "[ +3 ms] " prefix
|
||||||
|
String trimmedLine = line.trim();
|
||||||
|
if (trimmedLine.startsWith('[')) {
|
||||||
|
final int prefixEndIndex = trimmedLine.indexOf(']');
|
||||||
|
if (prefixEndIndex > 0) {
|
||||||
|
trimmedLine = trimmedLine
|
||||||
|
.substring(prefixEndIndex + 1, trimmedLine.length)
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remainingExpectedLines.remove(trimmedLine);
|
||||||
|
remainingExpectedLines.removeWhere((Pattern expectedLine) => trimmedLine.contains(expectedLine));
|
||||||
|
if (unexpectedLines != null && unexpectedLines.contains(trimmedLine)) {
|
||||||
|
unexpectedLinesFound.add(trimmedLine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect(
|
||||||
|
result.exitCode,
|
||||||
|
0,
|
||||||
|
reason: 'Failed to build app for "${command.join(' ')}":\n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
remainingExpectedLines,
|
||||||
|
isEmpty,
|
||||||
|
reason: 'Did not find expected lines for "${command.join(' ')}":\n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
unexpectedLinesFound,
|
||||||
|
isEmpty,
|
||||||
|
reason: 'Found unexpected lines for "${command.join(' ')}":\n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> cleanApp(String flutterBin, String workingDirectory) async {
|
||||||
|
final ProcessResult result = await processManager.run(
|
||||||
|
<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'clean',
|
||||||
|
],
|
||||||
|
workingDirectory: workingDirectory,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
result.exitCode,
|
||||||
|
0,
|
||||||
|
reason: 'Failed to clean app: \n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<SwiftPackageManagerPlugin> createPlugin(
|
||||||
|
String flutterBin,
|
||||||
|
String workingDirectory, {
|
||||||
|
required String platform,
|
||||||
|
required String iosLanguage,
|
||||||
|
bool usesSwiftPackageManager = false,
|
||||||
|
}) async {
|
||||||
|
final String dependencyManager = usesSwiftPackageManager ? 'spm' : 'cocoapods';
|
||||||
|
|
||||||
|
// Create plugin
|
||||||
|
final String pluginName = '${platform}_${iosLanguage}_${dependencyManager}_plugin';
|
||||||
|
final ProcessResult result = await processManager.run(
|
||||||
|
<String>[
|
||||||
|
flutterBin,
|
||||||
|
...getLocalEngineArguments(),
|
||||||
|
'create',
|
||||||
|
'--org',
|
||||||
|
'io.flutter.devicelab',
|
||||||
|
'--template=plugin',
|
||||||
|
'--platforms=$platform',
|
||||||
|
'-i',
|
||||||
|
iosLanguage,
|
||||||
|
pluginName,
|
||||||
|
],
|
||||||
|
workingDirectory: workingDirectory,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
result.exitCode,
|
||||||
|
0,
|
||||||
|
reason: 'Failed to create plugin: \n'
|
||||||
|
'stdout: \n${result.stdout}\n'
|
||||||
|
'stderr: \n${result.stderr}\n',
|
||||||
|
);
|
||||||
|
|
||||||
|
final Directory pluginDirectory = fileSystem.directory(
|
||||||
|
fileSystem.path.join(workingDirectory, pluginName),
|
||||||
|
);
|
||||||
|
|
||||||
|
return SwiftPackageManagerPlugin(
|
||||||
|
pluginName: pluginName,
|
||||||
|
pluginPath: pluginDirectory.path,
|
||||||
|
platform: platform,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void addDependency({
|
||||||
|
required SwiftPackageManagerPlugin plugin,
|
||||||
|
required String appDirectoryPath,
|
||||||
|
}) {
|
||||||
|
final File pubspec = fileSystem.file(
|
||||||
|
fileSystem.path.join(appDirectoryPath, 'pubspec.yaml'),
|
||||||
|
);
|
||||||
|
final String pubspecContent = pubspec.readAsStringSync();
|
||||||
|
pubspec.writeAsStringSync(
|
||||||
|
pubspecContent.replaceFirst(
|
||||||
|
'\ndependencies:\n',
|
||||||
|
'\ndependencies:\n ${plugin.pluginName}:\n path: ${plugin.pluginPath}\n',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disableSwiftPackageManagerByPubspec({
|
||||||
|
required String appDirectoryPath,
|
||||||
|
}) {
|
||||||
|
final File pubspec = fileSystem.file(
|
||||||
|
fileSystem.path.join(appDirectoryPath, 'pubspec.yaml'),
|
||||||
|
);
|
||||||
|
final String pubspecContent = pubspec.readAsStringSync();
|
||||||
|
pubspec.writeAsStringSync(
|
||||||
|
pubspecContent.replaceFirst(
|
||||||
|
'\n# The following section is specific to Flutter packages.\nflutter:\n',
|
||||||
|
'\n# The following section is specific to Flutter packages.\nflutter:\n disable-swift-package-manager: true',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static SwiftPackageManagerPlugin integrationTestPlugin(String platform) {
|
||||||
|
final String flutterRoot = getFlutterRoot();
|
||||||
|
return SwiftPackageManagerPlugin(
|
||||||
|
platform: platform,
|
||||||
|
pluginName:
|
||||||
|
(platform == 'ios') ? 'integration_test' : 'integration_test_macos',
|
||||||
|
pluginPath: (platform == 'ios')
|
||||||
|
? fileSystem.path.join(flutterRoot, 'packages', 'integration_test')
|
||||||
|
: fileSystem.path.join(flutterRoot, 'packages', 'integration_test', 'integration_test_macos'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<Pattern> expectedLines({
|
||||||
|
required String platform,
|
||||||
|
required String appDirectoryPath,
|
||||||
|
SwiftPackageManagerPlugin? cocoaPodsPlugin,
|
||||||
|
SwiftPackageManagerPlugin? swiftPackagePlugin,
|
||||||
|
bool swiftPackageMangerEnabled = false,
|
||||||
|
bool migrated = false,
|
||||||
|
}) {
|
||||||
|
final String frameworkName = platform == 'ios' ? 'Flutter' : 'FlutterMacOS';
|
||||||
|
final String appPlatformDirectoryPath = fileSystem.path.join(
|
||||||
|
appDirectoryPath,
|
||||||
|
platform,
|
||||||
|
);
|
||||||
|
|
||||||
|
final List<Pattern> expectedLines = <Pattern>[];
|
||||||
|
if (swiftPackageMangerEnabled) {
|
||||||
|
expectedLines.addAll(<String>[
|
||||||
|
'FlutterGeneratedPluginSwiftPackage: $appPlatformDirectoryPath/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage',
|
||||||
|
"➜ Explicit dependency on target 'FlutterGeneratedPluginSwiftPackage' in project 'FlutterGeneratedPluginSwiftPackage'",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
if (swiftPackagePlugin != null) {
|
||||||
|
// If using a Swift Package plugin, but Swift Package Manager is not enabled, it falls back to being used as a CocoaPods plugin.
|
||||||
|
if (swiftPackageMangerEnabled) {
|
||||||
|
expectedLines.addAll(<Pattern>[
|
||||||
|
RegExp('${swiftPackagePlugin.pluginName}: [/private]*${swiftPackagePlugin.pluginPath}/$platform/${swiftPackagePlugin.pluginName} @ local'),
|
||||||
|
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project '${swiftPackagePlugin.pluginName}'",
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
expectedLines.addAll(<String>[
|
||||||
|
'-> Installing ${swiftPackagePlugin.pluginName} (0.0.1)',
|
||||||
|
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project 'Pods'",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cocoaPodsPlugin != null) {
|
||||||
|
expectedLines.addAll(<String>[
|
||||||
|
'Running pod install...',
|
||||||
|
'-> Installing $frameworkName (1.0.0)',
|
||||||
|
'-> Installing ${cocoaPodsPlugin.pluginName} (0.0.1)',
|
||||||
|
"Target 'Pods-Runner' in project 'Pods'",
|
||||||
|
"➜ Explicit dependency on target '$frameworkName' in project 'Pods'",
|
||||||
|
"➜ Explicit dependency on target '${cocoaPodsPlugin.pluginName}' in project 'Pods'",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
if (migrated) {
|
||||||
|
expectedLines.addAll(<String>[
|
||||||
|
'Adding Swift Package Manager integration...',
|
||||||
|
'Running pod install...',
|
||||||
|
"Target 'Pods-Runner' in project 'Pods'",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return expectedLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<String> unexpectedLines({
|
||||||
|
required String platform,
|
||||||
|
required String appDirectoryPath,
|
||||||
|
SwiftPackageManagerPlugin? cocoaPodsPlugin,
|
||||||
|
SwiftPackageManagerPlugin? swiftPackagePlugin,
|
||||||
|
bool swiftPackageMangerEnabled = false,
|
||||||
|
bool migrated = false,
|
||||||
|
}) {
|
||||||
|
final String frameworkName = platform == 'ios' ? 'Flutter' : 'FlutterMacOS';
|
||||||
|
final List<String> unexpectedLines = <String>[];
|
||||||
|
if (cocoaPodsPlugin == null && !migrated) {
|
||||||
|
unexpectedLines.addAll(<String>[
|
||||||
|
'Running pod install...',
|
||||||
|
'-> Installing $frameworkName (1.0.0)',
|
||||||
|
"Target 'Pods-Runner' in project 'Pods'",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
if (swiftPackagePlugin != null) {
|
||||||
|
if (swiftPackageMangerEnabled) {
|
||||||
|
unexpectedLines.addAll(<String>[
|
||||||
|
'-> Installing ${swiftPackagePlugin.pluginName} (0.0.1)',
|
||||||
|
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project 'Pods'",
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
unexpectedLines.addAll(<String>[
|
||||||
|
'${swiftPackagePlugin.pluginName}: ${swiftPackagePlugin.pluginPath}/$platform/${swiftPackagePlugin.pluginName} @ local',
|
||||||
|
"➜ Explicit dependency on target '${swiftPackagePlugin.pluginName}' in project '${swiftPackagePlugin.pluginName}'",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!migrated) {
|
||||||
|
unexpectedLines.addAll(<String>[
|
||||||
|
'Adding Swift Package Manager integration...',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return unexpectedLines;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SwiftPackageManagerPlugin {
|
||||||
|
SwiftPackageManagerPlugin({
|
||||||
|
required this.pluginName,
|
||||||
|
required this.pluginPath,
|
||||||
|
required this.platform,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String pluginName;
|
||||||
|
final String pluginPath;
|
||||||
|
final String platform;
|
||||||
|
String get exampleAppPath => fileSystem.path.join(pluginPath, 'example');
|
||||||
|
String get exampleAppPlatformPath => fileSystem.path.join(exampleAppPath, platform);
|
||||||
|
}
|
Loading…
Reference in a new issue