|
4 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
5 | 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
6 | 6 |
|
| 7 | +project 'Runner', { |
| 8 | + 'Debug' => :debug, |
| 9 | + 'Profile' => :release, |
| 10 | + 'Release' => :release, |
| 11 | +} |
| 12 | + |
7 | 13 | def parse_KV_file(file, separator='=')
|
8 | 14 | file_abs_path = File.expand_path(file)
|
9 | 15 | if !File.exists? file_abs_path
|
10 | 16 | return [];
|
11 | 17 | end
|
12 |
| - pods_ary = [] |
| 18 | + generated_key_values = {} |
13 | 19 | skip_line_start_symbols = ["#", "/"]
|
14 |
| - File.foreach(file_abs_path) { |line| |
15 |
| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } |
16 |
| - plugin = line.split(pattern=separator) |
17 |
| - if plugin.length == 2 |
18 |
| - podname = plugin[0].strip() |
19 |
| - path = plugin[1].strip() |
20 |
| - podpath = File.expand_path("#{path}", file_abs_path) |
21 |
| - pods_ary.push({:name => podname, :path => podpath}); |
22 |
| - else |
23 |
| - puts "Invalid plugin specification: #{line}" |
24 |
| - end |
25 |
| - } |
26 |
| - return pods_ary |
| 20 | + File.foreach(file_abs_path) do |line| |
| 21 | + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } |
| 22 | + plugin = line.split(pattern=separator) |
| 23 | + if plugin.length == 2 |
| 24 | + podname = plugin[0].strip() |
| 25 | + path = plugin[1].strip() |
| 26 | + podpath = File.expand_path("#{path}", file_abs_path) |
| 27 | + generated_key_values[podname] = podpath |
| 28 | + else |
| 29 | + puts "Invalid plugin specification: #{line}" |
| 30 | + end |
| 31 | + end |
| 32 | + generated_key_values |
27 | 33 | end
|
28 | 34 |
|
29 | 35 | target 'Runner' do
|
30 | 36 | use_frameworks!
|
| 37 | + use_modular_headers! |
31 | 38 |
|
32 |
| - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock |
33 |
| - # referring to absolute paths on developers' machines. |
34 |
| - system('rm -rf .symlinks') |
35 |
| - system('mkdir -p .symlinks/plugins') |
| 39 | + # Flutter Pod |
36 | 40 |
|
37 |
| - # Flutter Pods |
38 |
| - generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') |
39 |
| - if generated_xcode_build_settings.empty? |
40 |
| - puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." |
41 |
| - end |
42 |
| - generated_xcode_build_settings.map { |p| |
43 |
| - if p[:name] == 'FLUTTER_FRAMEWORK_DIR' |
44 |
| - symlink = File.join('.symlinks', 'flutter') |
45 |
| - File.symlink(File.dirname(p[:path]), symlink) |
46 |
| - pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) |
| 41 | + copied_flutter_dir = File.join(__dir__, 'Flutter') |
| 42 | + copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') |
| 43 | + copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') |
| 44 | + unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) |
| 45 | + # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. |
| 46 | + # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. |
| 47 | + # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. |
| 48 | + |
| 49 | + generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') |
| 50 | + unless File.exist?(generated_xcode_build_settings_path) |
| 51 | + raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" |
47 | 52 | end
|
48 |
| - } |
| 53 | + generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) |
| 54 | + cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; |
| 55 | + |
| 56 | + unless File.exist?(copied_framework_path) |
| 57 | + FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) |
| 58 | + end |
| 59 | + unless File.exist?(copied_podspec_path) |
| 60 | + FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) |
| 61 | + end |
| 62 | + end |
| 63 | + |
| 64 | + # Keep pod path relative so it can be checked into Podfile.lock. |
| 65 | + pod 'Flutter', :path => 'Flutter' |
49 | 66 |
|
50 | 67 | # Plugin Pods
|
| 68 | + |
| 69 | + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock |
| 70 | + # referring to absolute paths on developers' machines. |
| 71 | + system('rm -rf .symlinks') |
| 72 | + system('mkdir -p .symlinks/plugins') |
51 | 73 | plugin_pods = parse_KV_file('../.flutter-plugins')
|
52 |
| - plugin_pods.map { |p| |
53 |
| - symlink = File.join('.symlinks', 'plugins', p[:name]) |
54 |
| - File.symlink(p[:path], symlink) |
55 |
| - pod p[:name], :path => File.join(symlink, 'ios') |
56 |
| - } |
| 74 | + plugin_pods.each do |name, path| |
| 75 | + symlink = File.join('.symlinks', 'plugins', name) |
| 76 | + File.symlink(path, symlink) |
| 77 | + pod name, :path => File.join(symlink, 'ios') |
| 78 | + end |
57 | 79 | end
|
58 | 80 |
|
| 81 | +# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. |
| 82 | +install! 'cocoapods', :disable_input_output_paths => true |
| 83 | + |
59 | 84 | post_install do |installer|
|
60 | 85 | installer.pods_project.targets.each do |target|
|
61 | 86 | target.build_configurations.each do |config|
|
|
0 commit comments