-
Notifications
You must be signed in to change notification settings - Fork 29.8k
Always embed iOS Flutter.framework build mode version from Xcode configuration #42029
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,51 +15,66 @@ def parse_KV_file(file, separator='=') | |
| if !File.exists? file_abs_path | ||
| return []; | ||
| end | ||
| pods_ary = [] | ||
| generated_key_values = {} | ||
|
||
| skip_line_start_symbols = ["#", "/"] | ||
| File.foreach(file_abs_path) { |line| | ||
| next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } | ||
| plugin = line.split(pattern=separator) | ||
| 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 | ||
| File.foreach(file_abs_path) do |line| | ||
| next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } | ||
| plugin = line.split(pattern=separator) | ||
| if plugin.length == 2 | ||
| podname = plugin[0].strip() | ||
| path = plugin[1].strip() | ||
| podpath = File.expand_path("#{path}", file_abs_path) | ||
| generated_key_values[podname] = podpath | ||
| else | ||
| puts "Invalid plugin specification: #{line}" | ||
| end | ||
| end | ||
| generated_key_values | ||
| end | ||
|
|
||
| target 'Runner' do | ||
| use_modular_headers! | ||
|
|
||
| # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock | ||
| # referring to absolute paths on developers' machines. | ||
| system('rm -rf .symlinks') | ||
| system('mkdir -p .symlinks/plugins') | ||
| # Flutter Pod | ||
|
|
||
| # Flutter Pods | ||
| generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') | ||
| if generated_xcode_build_settings.empty? | ||
| puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first." | ||
| end | ||
| generated_xcode_build_settings.map { |p| | ||
| if p[:name] == 'FLUTTER_FRAMEWORK_DIR' | ||
| symlink = File.join('.symlinks', 'flutter') | ||
| File.symlink(File.dirname(p[:path]), symlink) | ||
| pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) | ||
| copied_flutter_dir = File.join(__dir__, 'Flutter') | ||
| copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') | ||
| copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') | ||
| unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) | ||
| # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. | ||
| # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. | ||
| # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. | ||
|
|
||
| generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') | ||
| unless File.exist?(generated_xcode_build_settings_path) | ||
| raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" | ||
| end | ||
| } | ||
| generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) | ||
| cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; | ||
|
|
||
| unless File.exist?(copied_framework_path) | ||
| FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) | ||
| end | ||
| unless File.exist?(copied_podspec_path) | ||
| FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) | ||
| end | ||
| end | ||
|
|
||
| # Keep pod path relative so it can be checked into Podfile.lock. | ||
| pod 'Flutter', :path => 'Flutter' | ||
|
|
||
| # Plugin Pods | ||
|
|
||
| # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock | ||
| # referring to absolute paths on developers' machines. | ||
| system('rm -rf .symlinks') | ||
| system('mkdir -p .symlinks/plugins') | ||
| plugin_pods = parse_KV_file('../.flutter-plugins') | ||
| plugin_pods.map { |p| | ||
| symlink = File.join('.symlinks', 'plugins', p[:name]) | ||
| File.symlink(p[:path], symlink) | ||
| pod p[:name], :path => File.join(symlink, 'ios') | ||
| } | ||
| plugin_pods.each do |name, path| | ||
| symlink = File.join('.symlinks', 'plugins', name) | ||
| File.symlink(path, symlink) | ||
| pod name, :path => File.join(symlink, 'ios') | ||
| end | ||
| end | ||
|
|
||
| # Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,39 +4,77 @@ | |
| # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||
|
|
||
| def parse_KV_file(file,separator='=') | ||
| project 'Runner', { | ||
|
||
| 'Debug' => :debug, | ||
| 'Profile' => :release, | ||
| 'Release' => :release, | ||
| } | ||
|
|
||
| def parse_KV_file(file, separator='=') | ||
| file_abs_path = File.expand_path(file) | ||
| if !File.exists? file_abs_path | ||
| return []; | ||
| end | ||
| pods_ary = [] | ||
| generated_key_values = {} | ||
| skip_line_start_symbols = ["#", "/"] | ||
| File.foreach(file_abs_path) { |line| | ||
| next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } | ||
| plugin = line.split(pattern=separator) | ||
| 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 | ||
| File.foreach(file_abs_path) do |line| | ||
| next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } | ||
| plugin = line.split(pattern=separator) | ||
| if plugin.length == 2 | ||
| podname = plugin[0].strip() | ||
| path = plugin[1].strip() | ||
| podpath = File.expand_path("#{path}", file_abs_path) | ||
| generated_key_values[podname] = podpath | ||
| else | ||
| puts "Invalid plugin specification: #{line}" | ||
| end | ||
| end | ||
| generated_key_values | ||
| end | ||
|
|
||
| target 'Runner' do | ||
| use_modular_headers! | ||
|
|
||
| # Flutter Pods | ||
| pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR'] | ||
|
|
||
| # Flutter Pod | ||
|
|
||
| copied_flutter_dir = File.join(__dir__, 'Flutter') | ||
| copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') | ||
| copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') | ||
| unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) | ||
| # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. | ||
| # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. | ||
| # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. | ||
|
|
||
| generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') | ||
| unless File.exist?(generated_xcode_build_settings_path) | ||
| raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" | ||
| end | ||
| generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) | ||
| cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; | ||
|
|
||
| unless File.exist?(copied_framework_path) | ||
| FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) | ||
| end | ||
| unless File.exist?(copied_podspec_path) | ||
| FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) | ||
| end | ||
| end | ||
|
|
||
| # Keep pod path relative so it can be checked into Podfile.lock. | ||
| pod 'Flutter', :path => 'Flutter' | ||
|
|
||
| # Plugin Pods | ||
| plugin_pods = parse_KV_file("../.flutter-plugins") | ||
| plugin_pods.map{ |p| | ||
| pod p[:name], :path => File.expand_path("ios",p[:path]) | ||
| } | ||
|
|
||
| # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock | ||
| # referring to absolute paths on developers' machines. | ||
| system('rm -rf .symlinks') | ||
| system('mkdir -p .symlinks/plugins') | ||
| plugin_pods = parse_KV_file('../.flutter-plugins') | ||
| plugin_pods.each do |name, path| | ||
| symlink = File.join('.symlinks', 'plugins', name) | ||
| File.symlink(path, symlink) | ||
| pod name, :path => File.join(symlink, 'ios') | ||
| end | ||
| end | ||
|
|
||
| # Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. | ||
|
|
@@ -49,4 +87,4 @@ post_install do |installer| | |
| config.build_settings['ENABLE_BITCODE'] = 'NO' | ||
| end | ||
| end | ||
| end | ||
| end | ||

There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a copy of the template.