Class: Pod::PrebuildInstaller

Inherits:
Installer show all
Defined in:
lib/cocoapods-binary-cache/pod-binary/prebuild.rb

Overview

rubocop:disable Metrics/ClassLength

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Installer

#alter_specs_for_prebuilt_pods, #create_pod_installer, #original_create_pod_installer, #prebuilt_pod_names, #prebuilt_pod_targets, #validate_every_pod_only_have_one_form

Constructor Details

#initialize(options) ⇒ PrebuildInstaller

Returns a new instance of PrebuildInstaller.



11
12
13
14
15
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 11

def initialize(options)
  super(options[:sandbox], options[:podfile], options[:lockfile])
  @cache_validation = options[:cache_validation]
  @lockfile_wrapper = lockfile && PodPrebuild::Lockfile.new(lockfile)
end

Instance Attribute Details

#lockfile_wrapperObject (readonly)

Returns the value of attribute lockfile_wrapper.



9
10
11
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 9

def lockfile_wrapper
  @lockfile_wrapper
end

Instance Method Details

#clean_delta_fileObject



122
123
124
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 122

def clean_delta_file
  prebuild_output.clean_delta_file
end

#collect_metadata(target, output_path) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 126

def (target, output_path)
   = PodPrebuild::Metadata.in_dir(output_path)
  .framework_name = target.framework_name
  .static_framework = target.static_framework?
  resource_paths = target.resource_paths
  .resources = resource_paths.is_a?(Hash) ? resource_paths.values.flatten : resource_paths
  .resource_bundles = target
    .file_accessors
    .map { |f| f.resource_bundles.keys }
    .flatten
    .map { |name| "#{name}.bundle" }
  .build_settings = pods_project.targets
    .detect { |native_target| native_target.name == target.name }
    .build_configurations
    .detect { |config| config.name == PodPrebuild.config.prebuild_config }
    .build_settings
  .source_hash = @lockfile_wrapper && @lockfile_wrapper.dev_pod_hash(target.name)

  # Store root path for code-coverage support later
  # TODO: update driver code-coverage logic to use path stored here
  project_root = PathUtils.remove_last_path_component(@sandbox.standard_sanbox_path.to_s)
  .project_root = project_root
  .save!
end

#prebuild_frameworks!Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 37

def prebuild_frameworks!
  existed_framework_folder = sandbox.generate_framework_path
  sandbox_path = sandbox.root
  targets = targets_to_prebuild
  Pod::UI.puts "Prebuild frameworks (total #{targets.count}): #{targets.map(&:name)}".magenta

  run_code_gen!(targets)

  PodPrebuild.remove_build_dir(sandbox_path)
  PodPrebuild.build(
    sandbox: sandbox_path,
    targets: targets,
    configuration: PodPrebuild.config.prebuild_config,
    output_path: sandbox.generate_framework_path,
    bitcode_enabled: PodPrebuild.config.bitcode_enabled?,
    device_build_enabled: PodPrebuild.config.device_build_enabled?,
    disable_dsym: PodPrebuild.config.disable_dsym?,
    args: PodPrebuild.config.build_args
  )
  PodPrebuild.remove_build_dir(sandbox_path)

  targets.each do |target|
    (target, sandbox.framework_folder_path_for_target_name(target.name))
  end

  # copy vendored libraries and frameworks
  targets.each do |target|
    root_path = sandbox.pod_dir(target.name)
    target_folder = sandbox.framework_folder_path_for_target_name(target.name)

    # If target shouldn't build, we copy all the original files
    # This is for target with only .a and .h files
    unless target.should_build?
      FileUtils.cp_r(root_path, target_folder, :remove_destination => true)
      next
    end

    target.spec_consumers.each do |consumer|
      file_accessor = Sandbox::FileAccessor.new(root_path, consumer)
      lib_paths = file_accessor.vendored_frameworks || []
      lib_paths += file_accessor.vendored_libraries
      # @TODO dSYM files
      lib_paths.each do |lib_path|
        relative = lib_path.relative_path_from(root_path)
        destination = target_folder + relative
        destination.dirname.mkpath unless destination.dirname.exist?
        FileUtils.cp_r(lib_path, destination, :remove_destination => true)
      end
    end
  end

  # save the pod_name for prebuild framwork in sandbox
  targets.each do |target|
    sandbox.save_pod_name_for_target target
  end

  # Remove useless files
  # remove useless pods
  all_needed_names = pod_targets.map(&:name).uniq
  useless_target_names = sandbox.exsited_framework_target_names.reject do |name|
    all_needed_names.include? name
  end
  useless_target_names.each do |name|
    Pod::UI.message "Remove: #{name}"
    path = sandbox.framework_folder_path_for_target_name(name)
    path.rmtree if path.exist?
  end

  if PodPrebuild.config.dont_remove_source_code?
    # just remove the tmp files
    path = sandbox.root + "Manifest.lock.tmp"
    path.rmtree if path.exist?
  else
    # only keep manifest.lock and framework folder in _Prebuild
    to_remain_files = ["Manifest.lock", File.basename(existed_framework_folder)]
    to_delete_files = sandbox_path.children.reject { |file| to_remain_files.include?(File.basename(file)) }
    to_delete_files.each { |file| file.rmtree if file.exist? }
  end

  prebuild_output.write_delta_file(
    updated: targets.map { |target| target.label.to_s },
    deleted: useless_target_names
  )
end

#prebuild_outputObject



25
26
27
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 25

def prebuild_output
  @prebuild_output ||= PodPrebuild::Output.new(sandbox)
end

#run_code_gen!(targets) ⇒ Object



17
18
19
20
21
22
23
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 17

def run_code_gen!(targets)
  return if PodPrebuild.config.prebuild_code_gen.nil?

  Pod::UI.title("Running code generation...") do
    PodPrebuild.config.prebuild_code_gen.call(self, targets)
  end
end

#targets_to_prebuildObject



29
30
31
32
33
34
35
# File 'lib/cocoapods-binary-cache/pod-binary/prebuild.rb', line 29

def targets_to_prebuild
  to_build = PodPrebuild.config.targets_to_prebuild_from_cli
  if to_build.empty?
    to_build = PodPrebuild.config.prebuild_all_pods? ? @cache_validation.all : @cache_validation.missed
  end
  pod_targets.select { |target| to_build.include?(target.name) }
end