Revert "Enable developers to run pod from terminal directly and skip pod install if possible. (#13374)" (#13770)
This reverts commit c6a17525e8ea63fef80325cdb8af2d6e5ca37f87.
diff --git a/packages/flutter_tools/lib/src/commands/inject_plugins.dart b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
index f1df432..bf53cb5 100644
--- a/packages/flutter_tools/lib/src/commands/inject_plugins.dart
+++ b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
@@ -24,7 +24,7 @@
@override
Future<Null> runCommand() async {
- final bool result = injectPlugins().hasPlugin;
+ final bool result = injectPlugins();
if (result) {
printStatus('GeneratedPluginRegistrants successfully written.');
} else {
diff --git a/packages/flutter_tools/lib/src/ios/cocoapods.dart b/packages/flutter_tools/lib/src/ios/cocoapods.dart
index f935821..78fd425 100644
--- a/packages/flutter_tools/lib/src/ios/cocoapods.dart
+++ b/packages/flutter_tools/lib/src/ios/cocoapods.dart
@@ -57,17 +57,15 @@
Future<Null> processPods({
@required Directory appIosDir,
+ @required String iosEngineDir,
bool isSwift: false,
- bool pluginOrFlutterPodChanged: true,
}) async {
if (await _checkPodCondition()) {
if (!fs.file(fs.path.join(appIosDir.path, 'Podfile')).existsSync()) {
await _createPodfile(appIosDir, isSwift);
} // TODO(xster): Add more logic for handling merge conflicts.
- if (_checkIfRunPodInstall(appIosDir.path, pluginOrFlutterPodChanged))
- await _runPodInstall(appIosDir);
- } else {
- throwToolExit('CocoaPods not available for project using Flutter plugins');
+
+ await _runPodInstall(appIosDir, iosEngineDir);
}
}
@@ -110,12 +108,13 @@
podfileTemplate.copySync(fs.path.join(bundle.path, 'Podfile'));
}
- Future<Null> _runPodInstall(Directory bundle) async {
+ Future<Null> _runPodInstall(Directory bundle, String engineDirectory) async {
final Status status = logger.startProgress('Running pod install...', expectSlowOperation: true);
final ProcessResult result = await processManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: bundle.path,
environment: <String, String>{
+ 'FLUTTER_FRAMEWORK_DIR': engineDirectory,
// See https://github.com/flutter/flutter/issues/10873.
// CocoaPods analytics adds a lot of latency.
'COCOAPODS_DISABLE_STATS': 'true',
@@ -138,28 +137,6 @@
}
}
- // Check if you need to run pod install.
- // The pod install will run if any of below is true.
- // 1.Any plugins changed (add/update/delete)
- // 2.The flutter.framework has changed (debug/release/profile)
- // 3.The podfile.lock doesn't exists
- // 4.The Pods/manifest.lock doesn't exists
- // 5.The podfile.lock doesn't match Pods/manifest.lock.
- bool _checkIfRunPodInstall(String appDir, bool pluginOrFlutterPodChanged) {
- if (pluginOrFlutterPodChanged)
- return true;
- // Check if podfile.lock and Pods/Manifest.lock exists and matches.
- final File podfileLockFile = fs.file(fs.path.join(appDir, 'Podfile.lock'));
- final File manifestLockFile =
- fs.file(fs.path.join(appDir, 'Pods', 'Manifest.lock'));
- if (!podfileLockFile.existsSync() ||
- !manifestLockFile.existsSync() ||
- podfileLockFile.readAsStringSync() !=
- manifestLockFile.readAsStringSync())
- return true;
- return false;
- }
-
void _diagnosePodInstallFailure(ProcessResult result) {
if (result.stdout is String && result.stdout.contains('out-of-date source repos')) {
printError(
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 00abe0e..e3ead3b 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -254,9 +254,14 @@
// copied over to a location that is suitable for Xcodebuild to find them.
final Directory appDirectory = fs.directory(app.appDirectory);
await _addServicesToBundle(appDirectory);
- final InjectPluginsResult injectionResult = injectPlugins();
- final bool hasFlutterPlugins = injectionResult.hasPlugin;
- final String priorGeneratedXCConfig = readGeneratedXCConfig(app.appDirectory);
+ final bool hasFlutterPlugins = injectPlugins();
+
+ if (hasFlutterPlugins)
+ await cocoaPods.processPods(
+ appIosDir: appDirectory,
+ iosEngineDir: flutterFrameworkDir(buildInfo.mode),
+ isSwift: app.isSwift,
+ );
updateXcodeGeneratedProperties(
projectPath: fs.currentDirectory.path,
@@ -266,15 +271,6 @@
previewDart2: buildInfo.previewDart2,
);
- if (hasFlutterPlugins) {
- final String currentGeneratedXCConfig = readGeneratedXCConfig(app.appDirectory);
- await cocoaPods.processPods(
- appIosDir: appDirectory,
- isSwift: app.isSwift,
- pluginOrFlutterPodChanged: (injectionResult.hasChanged ||
- priorGeneratedXCConfig != currentGeneratedXCConfig));
- }
-
final List<String> commands = <String>[
'/usr/bin/env',
'xcrun',
@@ -359,17 +355,7 @@
}
}
-String readGeneratedXCConfig(String appPath) {
- final String generateXCConfigPath =
- fs.path.join(fs.currentDirectory.path, appPath, 'Flutter','Generated.xcconfig');
- final File generateXCConfigFile = fs.file(generateXCConfigPath);
- if (!generateXCConfigFile.existsSync())
- return null;
- return generateXCConfigFile.readAsStringSync();
-}
-
-Future<Null> diagnoseXcodeBuildFailure(
- XcodeBuildResult result, BuildableIOSApp app) async {
+Future<Null> diagnoseXcodeBuildFailure(XcodeBuildResult result, BuildableIOSApp app) async {
if (result.xcodeBuildExecution != null &&
result.xcodeBuildExecution.buildForPhysicalDevice &&
result.stdout?.contains('BCEROR') == true &&
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index 0eeaac7..19d7bc0 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -77,10 +77,8 @@
return plugins;
}
-// Return true if .flutter-plugins has changed, otherwise return false.
-bool _writeFlutterPluginsList(String directory, List<Plugin> plugins) {
+void _writeFlutterPluginsList(String directory, List<Plugin> plugins) {
final File pluginsProperties = fs.file(fs.path.join(directory, '.flutter-plugins'));
- final String priorFlutterPlugins = (pluginsProperties.existsSync() ? pluginsProperties.readAsStringSync() : null);
final String pluginManifest =
plugins.map((Plugin p) => '${p.name}=${escapePath(p.path)}').join('\n');
if (pluginManifest.isNotEmpty) {
@@ -90,8 +88,6 @@
pluginsProperties.deleteSync();
}
}
- final String currentFlutterPlugins = (pluginsProperties.existsSync() ? pluginsProperties.readAsStringSync() : null);
- return currentFlutterPlugins != priorFlutterPlugins;
}
const String _androidPluginRegistryTemplate = '''package io.flutter.plugins;
@@ -210,25 +206,17 @@
}
-class InjectPluginsResult{
- InjectPluginsResult({this.hasPlugin : false, this.hasChanged : false});
- /// True if any flutter plugin exists, otherwise false.
- final bool hasPlugin;
- /// True if plugins have changed since last build.
- final bool hasChanged;
-}
-
/// Finds Flutter plugins in the pubspec.yaml, creates platform injection
/// registries classes and add them to the build dependencies.
///
/// Returns whether any Flutter plugins are added.
-InjectPluginsResult injectPlugins({String directory}) {
+bool injectPlugins({String directory}) {
directory ??= fs.currentDirectory.path;
final List<Plugin> plugins = _findPlugins(directory);
- final bool hasPluginsChanged = _writeFlutterPluginsList(directory, plugins);
+ _writeFlutterPluginsList(directory, plugins);
if (fs.isDirectorySync(fs.path.join(directory, 'android')))
_writeAndroidPluginRegistry(directory, plugins);
if (fs.isDirectorySync(fs.path.join(directory, 'ios')))
_writeIOSPluginRegistry(directory, plugins);
- return new InjectPluginsResult(hasPlugin: plugins.isNotEmpty, hasChanged: hasPluginsChanged);
-}
\ No newline at end of file
+ return plugins.isNotEmpty;
+}
diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-objc b/packages/flutter_tools/templates/cocoapods/Podfile-objc
index 8350f1e..90b5f65 100644
--- a/packages/flutter_tools/templates/cocoapods/Podfile-objc
+++ b/packages/flutter_tools/templates/cocoapods/Podfile-objc
@@ -1,42 +1,30 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
-def parse_KV_file(file,seperator='=')
- file_abs_path = File.expand_path(file)
- if !File.exists? file_abs_path
- puts "Generated.xcconfig or .flutter-plugins expected but not present. If you're running pod install manually, make sure flutter build or flutter run is executed once first."
- return [];
- end
- pods_ary = []
- File.foreach(file_abs_path) { |line|
- plugin = line.split(pattern=seperator)
- if plugin.length == 2
- podname = plugin[0].strip()
- path = plugin[1].strip()
- podpath = File.expand_path("#{path}", file_abs_path)
- pods_ary.push({:name => podname,:path=>podpath});
- else
- puts "Invalid plugin specification: #{line}"
- end
- }
- return pods_ary
+if ENV['FLUTTER_FRAMEWORK_DIR'] == nil
+ abort('Please set FLUTTER_FRAMEWORK_DIR to the directory containing Flutter.framework')
end
target 'Runner' do
- use_frameworks!
- # Flutter Pods
- generated_xcode_build_settings = parse_KV_file("./Flutter/Generated.xcconfig")
- generated_xcode_build_settings.map{ |p|
- if p[:name]=='FLUTTER_FRAMEWORK_DIR'
- pod 'Flutter', :path => p[:path]
- end
- }
+ # Pods for Runner
- # Plugin Pods
- plugin_pods = parse_KV_file("../.flutter-plugins")
- plugin_pods.map{ |p|
- pod p[:name], :path => File.expand_path("ios",p[:path])
- }
+ # Flutter Pods
+ pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR']
+
+ if File.exists? '../.flutter-plugins'
+ flutter_root = File.expand_path('..')
+ File.foreach('../.flutter-plugins') { |line|
+ plugin = line.split(pattern='=')
+ if plugin.length == 2
+ name = plugin[0].strip()
+ path = plugin[1].strip()
+ resolved_path = File.expand_path("#{path}/ios", flutter_root)
+ pod name, :path => resolved_path
+ else
+ puts "Invalid plugin specification: #{line}"
+ end
+ }
+ end
end
post_install do |installer|
@@ -45,4 +33,4 @@
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
-end
\ No newline at end of file
+end
diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-swift b/packages/flutter_tools/templates/cocoapods/Podfile-swift
index 8350f1e..74b3de0 100644
--- a/packages/flutter_tools/templates/cocoapods/Podfile-swift
+++ b/packages/flutter_tools/templates/cocoapods/Podfile-swift
@@ -1,42 +1,32 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
-def parse_KV_file(file,seperator='=')
- file_abs_path = File.expand_path(file)
- if !File.exists? file_abs_path
- puts "Generated.xcconfig or .flutter-plugins expected but not present. If you're running pod install manually, make sure flutter build or flutter run is executed once first."
- return [];
- end
- pods_ary = []
- File.foreach(file_abs_path) { |line|
- plugin = line.split(pattern=seperator)
- if plugin.length == 2
- podname = plugin[0].strip()
- path = plugin[1].strip()
- podpath = File.expand_path("#{path}", file_abs_path)
- pods_ary.push({:name => podname,:path=>podpath});
- else
- puts "Invalid plugin specification: #{line}"
- end
- }
- return pods_ary
+if ENV['FLUTTER_FRAMEWORK_DIR'] == nil
+ abort('Please set FLUTTER_FRAMEWORK_DIR to the directory containing Flutter.framework')
end
target 'Runner' do
use_frameworks!
- # Flutter Pods
- generated_xcode_build_settings = parse_KV_file("./Flutter/Generated.xcconfig")
- generated_xcode_build_settings.map{ |p|
- if p[:name]=='FLUTTER_FRAMEWORK_DIR'
- pod 'Flutter', :path => p[:path]
- end
- }
- # Plugin Pods
- plugin_pods = parse_KV_file("../.flutter-plugins")
- plugin_pods.map{ |p|
- pod p[:name], :path => File.expand_path("ios",p[:path])
- }
+ # Pods for Runner
+
+ # Flutter Pods
+ pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR']
+
+ if File.exists? '../.flutter-plugins'
+ flutter_root = File.expand_path('..')
+ File.foreach('../.flutter-plugins') { |line|
+ plugin = line.split(pattern='=')
+ if plugin.length == 2
+ name = plugin[0].strip()
+ path = plugin[1].strip()
+ resolved_path = File.expand_path("#{path}/ios", flutter_root)
+ pod name, :path => resolved_path
+ else
+ puts "Invalid plugin specification: #{line}"
+ end
+ }
+ end
end
post_install do |installer|
@@ -45,4 +35,4 @@
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
-end
\ No newline at end of file
+end
diff --git a/packages/flutter_tools/test/ios/cocoapods_test.dart b/packages/flutter_tools/test/ios/cocoapods_test.dart
index 73c068d..493468f 100644
--- a/packages/flutter_tools/test/ios/cocoapods_test.dart
+++ b/packages/flutter_tools/test/ios/cocoapods_test.dart
@@ -41,7 +41,7 @@
when(mockProcessManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+ environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
)).thenReturn(exitsHappy);
});
@@ -50,12 +50,13 @@
() async {
await cocoaPodsUnderTest.processPods(
appIosDir: projectUnderTest,
+ iosEngineDir: 'engine/path',
);
expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Objective-C podfile template');
verify(mockProcessManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+ environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
));
},
overrides: <Type, Generator>{
@@ -69,13 +70,14 @@
() async {
await cocoaPodsUnderTest.processPods(
appIosDir: projectUnderTest,
+ iosEngineDir: 'engine/path',
isSwift: true,
);
expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Swift podfile template');
verify(mockProcessManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+ environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
));
},
overrides: <Type, Generator>{
@@ -92,11 +94,12 @@
..writeAsString('Existing Podfile');
await cocoaPodsUnderTest.processPods(
appIosDir: projectUnderTest,
+ iosEngineDir: 'engine/path',
); expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Existing Podfile');
verify(mockProcessManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+ environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
));
},
overrides: <Type, Generator>{
@@ -112,13 +115,14 @@
try {
await cocoaPodsUnderTest.processPods(
appIosDir: projectUnderTest,
+ iosEngineDir: 'engine/path',
);
fail('Expected tool error');
} catch (ToolExit) {
verifyNever(mockProcessManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+ environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
));
}
},
@@ -138,7 +142,7 @@
when(mockProcessManager.run(
<String>['pod', 'install', '--verbose'],
workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+ environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
)).thenReturn(new ProcessResult(
1,
1,
@@ -161,6 +165,7 @@
try {
await cocoaPodsUnderTest.processPods(
appIosDir: projectUnderTest,
+ iosEngineDir: 'engine/path',
); expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Existing Podfile');
fail('Exception expected');
} catch (ToolExit) {
@@ -172,62 +177,6 @@
ProcessManager: () => mockProcessManager,
},
);
-
- testUsingContext(
- 'Run pod install if plugins or flutter framework have changes.',
- () async {
- fs.file(fs.path.join('project', 'ios', 'Podfile'))
- ..createSync()
- ..writeAsString('Existing Podfile');
- fs.file(fs.path.join('project', 'ios', 'Podfile.lock'))
- ..createSync()
- ..writeAsString('Existing lock files.');
- fs.file(fs.path.join('project', 'ios', 'Pods','Manifest.lock'))
- ..createSync(recursive: true)
- ..writeAsString('Existing lock files.');
- await cocoaPodsUnderTest.processPods(
- appIosDir: projectUnderTest,
- pluginOrFlutterPodChanged: true
- );
- verify(mockProcessManager.run(
- <String>['pod', 'install', '--verbose'],
- workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
- ));
- },
- overrides: <Type, Generator>{
- FileSystem: () => fs,
- ProcessManager: () => mockProcessManager,
- },
- );
-
- testUsingContext(
- 'Skip pod install if plugins and flutter framework remain unchanged.',
- () async {
- fs.file(fs.path.join('project', 'ios', 'Podfile'))
- ..createSync()
- ..writeAsString('Existing Podfile');
- fs.file(fs.path.join('project', 'ios', 'Podfile.lock'))
- ..createSync()
- ..writeAsString('Existing lock files.');
- fs.file(fs.path.join('project', 'ios', 'Pods','Manifest.lock'))
- ..createSync(recursive: true)
- ..writeAsString('Existing lock files.');
- await cocoaPodsUnderTest.processPods(
- appIosDir: projectUnderTest,
- pluginOrFlutterPodChanged: false
- );
- verifyNever(mockProcessManager.run(
- <String>['pod', 'install', '--verbose'],
- workingDirectory: 'project/ios',
- environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
- ));
- },
- overrides: <Type, Generator>{
- FileSystem: () => fs,
- ProcessManager: () => mockProcessManager,
- },
- );
}
class MockProcessManager extends Mock implements ProcessManager {}