installFastlanePlugin function

Future<void> installFastlanePlugin(
  1. String pluginName, {
  2. String? workingDirectory,
})

Implementation

Future<void> installFastlanePlugin(
  String pluginName, {
  String? workingDirectory,
}) async {
  final gemFile = File('$workingDirectory/Gemfile');
  if (!(await gemFile.exists() &&
      (await gemFile.readAsString()).contains('plugins_path'))) {
    // Need to create a fastlane directory before working with plugins and the project.
    await Directory('$workingDirectory/fastlane').create(recursive: true);

    // Needed to support plugins
    final gemFileContent = '''
source "https://rubygems.org"
gem "fastlane"
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
''';
    await gemFile.writeAsString(gemFileContent);
  }

  final pluginFile = File('$workingDirectory/fastlane/Pluginfile');
  if (await pluginFile.exists() &&
      (await pluginFile.readAsString())
          .contains('fastlane-plugin-$pluginName')) {
    // Plugin already installed
    return;
  }

  // Install plugin to resolve the application id
  // Must run in sudo mode because of https://github.com/rubygems/rubygems/issues/6272#issuecomment-1381683835
  await runProcess(
    'sudo',
    ['fastlane', 'add_plugin', pluginName],
    workingDirectory: workingDirectory,
    runInShell: true,
    printCall: true,
  );
}