Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/flutterfire_cli/lib/src/commands/config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,7 @@ class ConfigCommand extends FlutterFireCommand {
buildConfiguration: iosInputs?.buildConfiguration,
target: iosInputs?.target,
platform: kIos,
xcodeProjectPath: iosInputs!.xcodeProjectPath,
projectConfiguration: iosInputs!.projectConfiguration,
);

Expand All @@ -682,6 +683,7 @@ class ConfigCommand extends FlutterFireCommand {
buildConfiguration: macosInputs?.buildConfiguration,
target: macosInputs?.target,
platform: kMacos,
xcodeProjectPath: macosInputs!.xcodeProjectPath,
projectConfiguration: macosInputs!.projectConfiguration,
);

Expand Down
7 changes: 7 additions & 0 deletions packages/flutterfire_cli/lib/src/commands/reconfigure.dart
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ class Reconfigure extends FlutterFireCommand {
// ios or macos
String platform,
) async {
final xcodeProjectPath = getXcodeProjectPath(
Directory(flutterApp!.package.path),
platform,
);
final appleMapKeys = [
kFlutter,
kPlatforms,
Expand All @@ -155,6 +159,7 @@ class Reconfigure extends FlutterFireCommand {
flutterAppPath: flutterApp!.package.path,
platform: platform,
logger: logger,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: ProjectConfiguration.buildConfiguration,
isDevDependency: flutterApp!.dependsOnPackage('flutterfire_cli'),
);
Expand Down Expand Up @@ -196,6 +201,7 @@ class Reconfigure extends FlutterFireCommand {
flutterAppPath: flutterApp!.package.path,
platform: platform,
logger: logger,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: ProjectConfiguration.defaultConfig,
isDevDependency: flutterApp!.dependsOnPackage('flutterfire_cli'),
);
Expand Down Expand Up @@ -231,6 +237,7 @@ class Reconfigure extends FlutterFireCommand {
flutterAppPath: flutterApp!.package.path,
platform: platform,
logger: logger,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: ProjectConfiguration.target,
isDevDependency: flutterApp!.dependsOnPackage('flutterfire_cli'),
);
Expand Down
2 changes: 2 additions & 0 deletions packages/flutterfire_cli/lib/src/common/inputs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ class AppleInputs {
AppleInputs({
this.buildConfiguration,
this.target,
required this.xcodeProjectPath,
required this.serviceFilePath,
required this.projectConfiguration,
});
final String? buildConfiguration;
final String? target;
final String xcodeProjectPath;
final String serviceFilePath;
ProjectConfiguration projectConfiguration;
}
27 changes: 18 additions & 9 deletions packages/flutterfire_cli/lib/src/common/prompts/apple_prompts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,11 @@ String getAppleServiceFile(
Future<String> promptCheckBuildConfiguration(
String buildConfiguration,
String platform,
String xcodeProjectPath,
) async {
final buildConfigurations = await findBuildConfigurationsAvailable(
platform,
getXcodeProjectPath(platform),
xcodeProjectPath,
);

if (!buildConfigurations.contains(buildConfiguration)) {
Expand All @@ -66,10 +67,13 @@ Future<String> promptCheckBuildConfiguration(
return buildConfiguration;
}

Future<String> promptGetBuildConfiguration(String platform) async {
Future<String> promptGetBuildConfiguration(
String platform,
String xcodeProjectPath,
) async {
final buildConfigurations = await findBuildConfigurationsAvailable(
platform,
getXcodeProjectPath(platform),
xcodeProjectPath,
);

final response = promptSelect(
Expand All @@ -80,9 +84,11 @@ Future<String> promptGetBuildConfiguration(String platform) async {
return buildConfigurations[response];
}

Future<String> promptGetTarget(String platform) async {
final targets =
await findTargetsAvailable(platform, getXcodeProjectPath(platform));
Future<String> promptGetTarget(
String platform,
String xcodeProjectPath,
) async {
final targets = await findTargetsAvailable(platform, xcodeProjectPath);

final response = promptSelect(
'Please choose one of the following targets',
Expand All @@ -92,9 +98,12 @@ Future<String> promptGetTarget(String platform) async {
return targets[response];
}

Future<String> promptCheckTarget(String target, String platform) async {
final targets =
await findTargetsAvailable(platform, getXcodeProjectPath(platform));
Future<String> promptCheckTarget(
String target,
String platform,
String xcodeProjectPath,
) async {
final targets = await findTargetsAvailable(platform, xcodeProjectPath);

if (!targets.contains(target)) {
if (isCI) {
Expand Down
45 changes: 38 additions & 7 deletions packages/flutterfire_cli/lib/src/common/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,7 @@ String androidAppBuildGradleKtsPathForAppDirectory(Directory directory) {

File xcodeProjectFileInDirectory(Directory directory, String platform) {
return File(
joinAll(
[directory.path, platform, 'Runner.xcodeproj', 'project.pbxproj'],
),
join(getXcodeProjectPath(directory, platform), 'project.pbxproj'),
);
}

Expand Down Expand Up @@ -502,11 +500,44 @@ Future<List<String>> findBuildConfigurationsAvailable(
return buildConfigurations;
}

String getXcodeProjectPath(String platform) {
return join(
Directory.current.path,
String getXcodeProjectPath(Directory directory, String platform) {
final platformDirectory = Directory(join(directory.path, platform));
final defaultProjectDirectory = Directory(
join(platformDirectory.path, 'Runner.xcodeproj'),
);

if (defaultProjectDirectory.existsSync()) {
return defaultProjectDirectory.path;
}

if (!platformDirectory.existsSync()) {
throw PlatformDirectoryDoesNotExistException(platformDirectory.path);
}

final xcodeProjectDirectories = platformDirectory
.listSync()
.whereType<Directory>()
.where((directory) => directory.path.endsWith('.xcodeproj'))
.toList();

if (xcodeProjectDirectories.length == 1) {
return xcodeProjectDirectories.single.path;
}

if (xcodeProjectDirectories.isEmpty) {
throw XcodeProjectException(
platform,
'Unable to find an Xcode project in ${platformDirectory.path}.',
);
}

final projectNames = xcodeProjectDirectories
.map((directory) => directory.path.split(Platform.pathSeparator).last)
.toList()
..sort();
throw XcodeProjectException(
platform,
'Runner.xcodeproj',
'Found multiple Xcode projects in ${platformDirectory.path}: ${projectNames.join(', ')}. Please keep a single Xcode project in this directory.',
);
}

Expand Down
19 changes: 15 additions & 4 deletions packages/flutterfire_cli/lib/src/common/validation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,19 @@ Future<AppleInputs> appleValidation({
String? targetResponse;
String? buildConfigurationResponse;
var configurationResponse = ProjectConfiguration.defaultConfig;
final xcodeProjectPath = getXcodeProjectPath(
Directory(flutterAppPath),
platform,
);

if (target == null && buildConfiguration == null && serviceFilePath == null) {
// Default configuration
return AppleInputs(
projectConfiguration: configurationResponse,
target: 'Runner',
xcodeProjectPath: xcodeProjectPath,
serviceFilePath: path.join(
Directory.current.path,
flutterAppPath,
platform,
'Runner',
appleServiceFileName,
Expand Down Expand Up @@ -77,18 +82,22 @@ Future<AppleInputs> appleValidation({

if (configurationResponse == ProjectConfiguration.target) {
// User chooses from list of targets
targetResponse = await promptGetTarget(platform);
targetResponse = await promptGetTarget(platform, xcodeProjectPath);
}

if (configurationResponse == ProjectConfiguration.buildConfiguration) {
// User chooses from list of build configurations
buildConfigurationResponse = await promptGetBuildConfiguration(platform);
buildConfigurationResponse = await promptGetBuildConfiguration(
platform,
xcodeProjectPath,
);
}
}

if (serviceFilePath != null && target != null) {
// Check if target exists
targetResponse = await promptCheckTarget(target, platform);
targetResponse =
await promptCheckTarget(target, platform, xcodeProjectPath);
configurationResponse = ProjectConfiguration.target;
}

Expand All @@ -97,6 +106,7 @@ Future<AppleInputs> appleValidation({
buildConfigurationResponse = await promptCheckBuildConfiguration(
buildConfiguration,
platform,
xcodeProjectPath,
);
configurationResponse = ProjectConfiguration.buildConfiguration;
}
Expand All @@ -105,6 +115,7 @@ Future<AppleInputs> appleValidation({
projectConfiguration: configurationResponse,
buildConfiguration: buildConfigurationResponse,
target: targetResponse,
xcodeProjectPath: xcodeProjectPath,
serviceFilePath: getAppleServiceFile(
serviceFilePath,
platform,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const bundleServiceScriptName =
Future<FirebaseJsonWrites> appleWrites({
required String platform,
required FlutterApp flutterApp,
required String xcodeProjectPath,
required String serviceFilePath,
required FirebaseOptions platformOptions,
required Logger logger,
Expand All @@ -32,6 +33,7 @@ Future<FirebaseJsonWrites> appleWrites({
serviceFilePath: serviceFilePath,
logger: logger,
platform: platform,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: projectConfiguration,
buildConfiguration: buildConfiguration!,
).apply();
Expand All @@ -43,6 +45,7 @@ Future<FirebaseJsonWrites> appleWrites({
serviceFilePath: serviceFilePath,
logger: logger,
platform: platform,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: projectConfiguration,
target: ProjectConfiguration.defaultConfig == projectConfiguration
? 'Runner'
Expand All @@ -58,6 +61,7 @@ class FirebaseAppleTargetConfiguration extends FirebaseAppleConfiguration {
required String serviceFilePath,
required Logger logger,
required String platform,
required String xcodeProjectPath,
required ProjectConfiguration projectConfiguration,
required this.target,
}) : super(
Expand All @@ -66,6 +70,7 @@ class FirebaseAppleTargetConfiguration extends FirebaseAppleConfiguration {
serviceFilePath: serviceFilePath,
logger: logger,
platform: platform,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: projectConfiguration,
);

Expand All @@ -89,7 +94,7 @@ class FirebaseAppleTargetConfiguration extends FirebaseAppleConfiguration {
return '''
require 'xcodeproj'
googleFile='$serviceFilePath'
xcodeFile='${getXcodeProjectPath(platform)}'
xcodeFile='$xcodeProjectPath'
targetName='$target'

project = Xcodeproj::Project.open(xcodeFile)
Expand Down Expand Up @@ -127,6 +132,7 @@ end
flutterAppPath: flutterApp.package.path,
logger: logger,
platform: platform,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: projectConfiguration,
isDevDependency: flutterApp.dependsOnPackage('flutterfire_cli'),
);
Expand All @@ -147,6 +153,7 @@ class FirebaseAppleBuildConfiguration extends FirebaseAppleConfiguration {
required String serviceFilePath,
required Logger logger,
required String platform,
required String xcodeProjectPath,
required ProjectConfiguration projectConfiguration,
required this.buildConfiguration,
}) : super(
Expand All @@ -155,6 +162,7 @@ class FirebaseAppleBuildConfiguration extends FirebaseAppleConfiguration {
serviceFilePath: serviceFilePath,
logger: logger,
platform: platform,
xcodeProjectPath: xcodeProjectPath,
projectConfiguration: projectConfiguration,
);
// e.g. Debug, Profile, Release, etc
Expand Down Expand Up @@ -192,7 +200,7 @@ class FirebaseAppleBuildConfiguration extends FirebaseAppleConfiguration {

return '''
require 'xcodeproj'
xcodeFile='${getXcodeProjectPath(platform)}'
xcodeFile='$xcodeProjectPath'
runScriptName='$bundleServiceScriptName'
project = Xcodeproj::Project.open(xcodeFile)

Expand Down Expand Up @@ -232,6 +240,7 @@ end
logger: logger,
projectConfiguration: projectConfiguration,
platform: platform,
xcodeProjectPath: xcodeProjectPath,
isDevDependency: flutterApp.dependsOnPackage('flutterfire_cli'),
);

Expand All @@ -255,10 +264,12 @@ abstract class FirebaseAppleConfiguration {
required this.serviceFilePath,
required this.logger,
required this.platform,
required this.xcodeProjectPath,
required this.projectConfiguration,
});
// Either "ios" or "macos"
final String platform;
final String xcodeProjectPath;
final FlutterApp flutterApp;
final FirebaseOptions platformOptions;
final String serviceFilePath;
Expand Down Expand Up @@ -308,6 +319,7 @@ Future<bool> addFlutterFireDebugSymbolsScript({
required String flutterAppPath,
required Logger logger,
required String platform,
required String xcodeProjectPath,
required ProjectConfiguration projectConfiguration,
required bool isDevDependency,
}) async {
Expand Down Expand Up @@ -356,6 +368,7 @@ Future<bool> addFlutterFireDebugSymbolsScript({
target,
projectConfiguration,
platform,
xcodeProjectPath,
isDevDependency,
),
]);
Expand All @@ -377,6 +390,7 @@ String _debugSymbolsScript(
String target,
ProjectConfiguration projectConfiguration,
String platform,
String xcodeProjectPath,
bool isDevDependency,
) {
final projectType = switch (projectConfiguration) {
Expand All @@ -388,7 +402,7 @@ String _debugSymbolsScript(

return '''
require 'xcodeproj'
xcodeFile='${getXcodeProjectPath(platform)}'
xcodeFile='$xcodeProjectPath'
runScriptName='$debugSymbolScriptName'
bundleScriptName='$bundleServiceScriptName'
project = Xcodeproj::Project.open(xcodeFile)
Expand Down
Loading
Loading