Class: Pod::Installer

Inherits:
Object
  • Object
show all
Defined in:
lib/cocoapods-binary/helper/feature_switches.rb,
lib/cocoapods-binary/Prebuild.rb,
lib/cocoapods-binary/Integration.rb,
lib/cocoapods-binary/Integration.rb,
lib/cocoapods-binary/helper/podfile_options.rb,
lib/cocoapods-binary/helper/feature_switches.rb

Overview

a option to disable install complete message

Defined Under Namespace

Classes: PodSourceInstaller

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.disable_install_complete_message(value) ⇒ Object



70
71
72
# File 'lib/cocoapods-binary/helper/feature_switches.rb', line 70

def self.disable_install_complete_message(value)
    @@disable_install_complete_message = value
end

.force_disable_integration(value) ⇒ Object



55
56
57
# File 'lib/cocoapods-binary/helper/feature_switches.rb', line 55

def self.force_disable_integration(value)
    @@force_disable_integration = value
end

Instance Method Details

#have_exact_prebuild_cache?Boolean

check if need to prebuild

Returns:

  • (Boolean)


38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/cocoapods-binary/Prebuild.rb', line 38

def have_exact_prebuild_cache?
    # check if need build frameworks
    return false if local_manifest == nil
    
    changes = prebuild_pods_changes
    added = changes.added
    changed = changes.changed 
    unchanged = changes.unchanged
    deleted = changes.deleted 
    
    unchange_framework_names = (added + unchanged)

    exsited_framework_names = sandbox.exsited_framework_names
    missing = unchanged.select do |pod_name|
        not exsited_framework_names.include?(pod_name)
    end

    needed = (added + changed + deleted + missing)
    return needed.empty?
end

#install_when_cache_hit!Object

The install method when have completed cache



61
62
63
64
65
66
# File 'lib/cocoapods-binary/Prebuild.rb', line 61

def install_when_cache_hit!
    # just print log
    self.sandbox.exsited_framework_names.each do |name|
        UI.puts "Using #{name}"
    end
end

#prebuild_frameworks!Object

Build the needed framework files



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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/cocoapods-binary/Prebuild.rb', line 70

def prebuild_frameworks! 

    # check
    # give a early warning, instead of after compiling all the pods
    Prebuild.check_one_pod_should_have_only_one_target(self.pod_targets)

    # build options
    sandbox_path = sandbox.root
    existed_framework_folder = sandbox.generate_framework_path
    bitcode_enabled = Pod::Podfile::DSL.bitcode_enabled
    targets = []
    
    if local_manifest != nil

        changes = prebuild_pods_changes
        added = changes.added
        changed = changes.changed 
        unchanged = changes.unchanged
        deleted = changes.deleted 
    
        existed_framework_folder.mkdir unless existed_framework_folder.exist?
        exsited_framework_names = sandbox.exsited_framework_names
    
        # additions
        missing = unchanged.select do |pod_name|
            not exsited_framework_names.include?(pod_name)
        end


        root_names_to_update = (added + changed + missing)

        # transform names to targets
        name_to_target_hash = self.pod_targets.reduce({}) do |sum, target|
            sum[target.name] = target
            sum
        end
        targets = root_names_to_update.map do |root_name|
            t = name_to_target_hash[root_name]
            raise "There's no target named (#{root_name}) in Pod.xcodeproj.\n #{name_to_target_hash.keys}" if t.nil?
            t
        end || []

        # add the dendencies
        dependency_targets = targets.map {|t| t.recursive_dependent_targets }.flatten.uniq || []
        targets = (targets + dependency_targets).uniq
    else
        targets = self.pod_targets
    end

    targets = targets.reject {|pod_target| sandbox.local?(pod_target.pod_name) }

    
    # build!
    Pod::UI.puts "Prebuild frameworks (total #{targets.count})"
    Pod::Prebuild.remove_build_dir(sandbox_path)
    targets.each do |target|
        if !target.should_build?
            UI.puts "Prebuilding #{target.label}"
            next
        end

        output_path = sandbox.framework_folder_path_for_pod_name(target.name)
        output_path.mkpath unless output_path.exist?
        Pod::Prebuild.build(sandbox_path, target, output_path, bitcode_enabled,  Podfile::DSL.custom_build_options,  Podfile::DSL.custom_build_options_simulator)

        # save the resource paths for later installing
        if target.static_framework? and !target.resource_paths.empty?
            framework_path = output_path + target.framework_name
            standard_sandbox_path = sandbox.standard_sanbox_path

            resources = begin
                if Pod::VERSION.start_with? "1.5"
                    target.resource_paths
                else
                    # resource_paths is Hash{String=>Array<String>} on 1.6 and above
                    # (use AFNetworking to generate a demo data)
                    # https://github.com/leavez/cocoapods-binary/issues/50
                    target.resource_paths.values.flatten
                end
            end
            raise "Wrong type: #{resources}" unless resources.kind_of? Array

            path_objects = resources.map do |path|
                object = Prebuild::Passer::ResourcePath.new
                object.real_file_path = framework_path + File.basename(path)
                object.target_file_path = path.gsub('${PODS_ROOT}', standard_sandbox_path.to_s) if path.start_with? '${PODS_ROOT}'
                object.target_file_path = path.gsub("${PODS_CONFIGURATION_BUILD_DIR}", standard_sandbox_path.to_s) if path.start_with? "${PODS_CONFIGURATION_BUILD_DIR}"
                object
            end
            Prebuild::Passer.resources_to_copy_for_static_framework[target.name] = path_objects
        end
    end            
    Pod::Prebuild.remove_build_dir(sandbox_path)


    # copy vendored libraries and frameworks
    targets.each do |target|
        root_path = self.sandbox.pod_dir(target.name)
        target_folder = sandbox.framework_folder_path_for_pod_name(target.name)
        
        # If target shouldn't build, we copy all the original files
        # This is for target with only .a and .h files
        if not target.should_build? 
            Prebuild::Passer.target_names_to_skip_integration_framework << target.pod_name
            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
    
    # Remove useless files
    # remove useless pods
    all_needed_names = self.pod_targets.map(&:name).uniq
    useless_names = sandbox.exsited_framework_names.reject do |name| 
        all_needed_names.include? name
    end
    useless_names.each do |name|
        path = sandbox.framework_folder_path_for_pod_name(name)
        path.rmtree if path.exist?
    end

    if not Podfile::DSL.dont_remove_source_code 
        # 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.select do |file|
            filename = File.basename(file)
            not to_remain_files.include?(filename)
        end
        to_delete_files.each do |path|
            path.rmtree if path.exist?
        end
    else 
        # just remove the tmp files
        path = sandbox.root + 'Manifest.lock.tmp'
        path.rmtree if path.exist?
    end
    


end

#prebuild_pod_namesObject

the root names who needs prebuild, including dependency pods.



102
103
104
# File 'lib/cocoapods-binary/helper/podfile_options.rb', line 102

def prebuild_pod_names 
   @prebuild_pod_names ||= self.prebuild_pod_targets.map(&:pod_name)
end

#prebuild_pod_targetsObject



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
# File 'lib/cocoapods-binary/helper/podfile_options.rb', line 73

def prebuild_pod_targets

    all = []

    aggregate_targets = self.aggregate_targets.select { |a| a.platform != :watchos }
    aggregate_targets.each do |aggregate_target|
        target_definition = aggregate_target.target_definition
        targets = aggregate_target.pod_targets || []

        # filter prebuild
        prebuild_names = target_definition.prebuild_framework_names
        if not Podfile::DSL.prebuild_all
            targets = targets.select { |pod_target| prebuild_names.include?(pod_target.pod_name) } 
        end
        dependency_targets = targets.map {|t| t.recursive_dependent_targets }.flatten.uniq || []
        targets = (targets + dependency_targets).uniq

        # filter should not prebuild
        explict_should_not_names = target_definition.should_not_prebuild_framework_names
        targets = targets.reject { |pod_target| explict_should_not_names.include?(pod_target.pod_name) } 

        all += targets
    end

    all = all.reject {|pod_target| sandbox.local?(pod_target.pod_name) }
    all.uniq
end

#remove_target_files_if_neededObject

Remove the old target files if prebuild frameworks changed



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/Integration.rb', line 95

def remove_target_files_if_needed

    changes = Pod::Prebuild::Passer.prebuild_pods_changes
    updated_names = []
    if changes == nil
        updated_names = PrebuildSandbox.from_standard_sandbox(self.sandbox).exsited_framework_names
    else
        added = changes.added
        changed = changes.changed 
        deleted = changes.deleted 
        updated_names = added + changed + deleted
    end

    updated_names.each do |name|
        root_name = Specification.root_name(name)
        next if self.sandbox.local?(root_name)

        # delete the cached files
        target_path = self.sandbox.pod_dir(root_name)
        target_path.rmtree if target_path.exist?

        support_path = sandbox.target_support_files_dir(root_name)
        support_path.rmtree if support_path.exist?
    end

end