Class: Pod::Installer::UserProjectIntegrator::TargetIntegrator
- Inherits:
-
Object
- Object
- Pod::Installer::UserProjectIntegrator::TargetIntegrator
- Defined in:
- lib/cocoapods/installer/user_project_integrator/target_integrator.rb,
lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb
Overview
This class is responsible for integrating the library generated by a TargetDefinition with its destination project.
Defined Under Namespace
Classes: XCConfigIntegrator
Constant Summary collapse
- BUILD_PHASE_PREFIX =
Returns the string to use as prefix for every build phase added to the user project.
'[CP] '.freeze
- USER_BUILD_PHASE_PREFIX =
Returns the string to use as prefix for every build phase declared by the user within a podfile or podspec.
'[CP-User] '.freeze
- CHECK_MANIFEST_PHASE_NAME =
Returns the name of the check manifest phase.
'Check Pods Manifest.lock'.freeze
- EMBED_FRAMEWORK_TARGET_TYPES =
Note:
This does not include :app_extension or :watch_extension because
frameworks are embedded in the output directory / product bundle.
these types must have their frameworks embedded in their host targets. For messages extensions, this only applies if it’s embedded in a messages application.
[:application, :unit_test_bundle, :ui_test_bundle, :watch2_extension, :messages_application].freeze
- EMBED_FRAMEWORK_PHASE_NAME =
Returns the name of the embed frameworks phase.
'Embed Pods Frameworks'.freeze
- COPY_PODS_RESOURCES_PHASE_NAME =
Returns the name of the copy resources phase.
'Copy Pods Resources'.freeze
- MAX_INPUT_OUTPUT_PATHS =
Returns the maximum number of input and output paths to use for a script phase.
1000
Instance Attribute Summary collapse
-
#target ⇒ AggregateTarget
readonly
The target that should be integrated.
Class Method Summary collapse
-
.create_or_update_build_phase(native_target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase) ⇒ void
Creates or update a shell script build phase for the given target.
-
.create_or_update_copy_resources_script_phase_to_target(native_target, script_path, input_paths = [], output_paths = []) ⇒ void
Adds a shell script build phase responsible to copy the resources generated by the TargetDefinition to the bundle of the product of the targets.
-
.create_or_update_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths = [], output_paths = []) ⇒ void
Adds a shell script build phase responsible to copy (embed) the frameworks generated by the TargetDefinition to the bundle of the product of the targets.
-
.create_or_update_user_script_phases(script_phases, native_target) ⇒ void
Updates all target script phases for the current target, including creating or updating, deleting and re-ordering.
-
.output_extension_for_resource(input_extension) ⇒ String
Returns an extension in the target that corresponds to the resource’s input extension.
-
.remove_copy_resources_script_phase_from_target(native_target) ⇒ Object
Delete a ‘Copy Pods Resources’ script phase if present.
-
.remove_embed_frameworks_script_phase_from_target(native_target) ⇒ Object
Delete a ‘Embed Pods Frameworks’ Copy Files Build Phase if present.
-
.resource_output_paths(resource_input_paths) ⇒ Array<String>
Returns the resource output paths for all given input paths.
-
.validate_input_output_path_limit(input_paths, output_paths) ⇒ void
Script phases can have a limited number of input and output paths due to each one being exported to ‘env`.
Instance Method Summary collapse
-
#initialize(target) ⇒ TargetIntegrator
constructor
Init a new TargetIntegrator.
-
#inspect ⇒ String
A string representation suitable for debugging.
-
#integrate! ⇒ void
Integrates the user project targets.
Constructor Details
#initialize(target) ⇒ TargetIntegrator
Init a new TargetIntegrator
55 56 57 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 55 def initialize(target) @target = target end |
Instance Attribute Details
#target ⇒ AggregateTarget (readonly)
Returns the target that should be integrated.
49 50 51 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 49 def target @target end |
Class Method Details
.create_or_update_build_phase(native_target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase) ⇒ void
This method returns an undefined value.
Creates or update a shell script build phase for the given target.
146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 146 def create_or_update_build_phase(native_target, phase_name, phase_class = Xcodeproj::Project::Object::PBXShellScriptBuildPhase) build_phases = native_target.build_phases.grep(phase_class) build_phases.find { |phase| phase.name && phase.name.end_with?(phase_name) }.tap { |p| p.name = phase_name if p } || native_target.project.new(phase_class).tap do |phase| UI.("Adding Build Phase '#{phase_name}' to project.") do phase.name = phase_name phase.show_env_vars_in_log = '0' native_target.build_phases << phase end end end |
.create_or_update_copy_resources_script_phase_to_target(native_target, script_path, input_paths = [], output_paths = []) ⇒ void
This method returns an undefined value.
Adds a shell script build phase responsible to copy the resources generated by the TargetDefinition to the bundle of the product of the targets.
114 115 116 117 118 119 120 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 114 def create_or_update_copy_resources_script_phase_to_target(native_target, script_path, input_paths = [], output_paths = []) phase_name = COPY_PODS_RESOURCES_PHASE_NAME phase = TargetIntegrator.create_or_update_build_phase(native_target, BUILD_PHASE_PREFIX + phase_name) phase.shell_script = %("#{script_path}"\n) phase.input_paths = input_paths phase.output_paths = output_paths end |
.create_or_update_embed_frameworks_script_phase_to_target(native_target, script_path, input_paths = [], output_paths = []) ⇒ void
This method returns an undefined value.
Adds a shell script build phase responsible to copy (embed) the frameworks generated by the TargetDefinition to the bundle of the product of the targets.
78 79 80 81 82 83 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 78 def (native_target, script_path, input_paths = [], output_paths = []) phase = TargetIntegrator.create_or_update_build_phase(native_target, BUILD_PHASE_PREFIX + EMBED_FRAMEWORK_PHASE_NAME) phase.shell_script = %("#{script_path}"\n) phase.input_paths = input_paths phase.output_paths = output_paths end |
.create_or_update_user_script_phases(script_phases, native_target) ⇒ void
This method returns an undefined value.
Updates all target script phases for the current target, including creating or updating, deleting and re-ordering.
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 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 163 def create_or_update_user_script_phases(script_phases, native_target) script_phase_names = script_phases.map { |k| k[:name] } # Delete script phases no longer present in the target. native_target_script_phases = native_target.shell_script_build_phases.select { |bp| !bp.name.nil? && bp.name.start_with?(USER_BUILD_PHASE_PREFIX) } native_target_script_phases.each do |script_phase| script_phase_name_without_prefix = script_phase.name.sub(USER_BUILD_PHASE_PREFIX, '') unless script_phase_names.include?(script_phase_name_without_prefix) native_target.build_phases.delete(script_phase) end end # Create or update the ones that are expected to be. script_phases.each do |script_phase| name_with_prefix = USER_BUILD_PHASE_PREFIX + script_phase[:name] phase = TargetIntegrator.create_or_update_build_phase(native_target, name_with_prefix) phase.shell_script = script_phase[:script] phase.shell_path = script_phase[:shell_path] if script_phase.key?(:shell_path) phase.input_paths = script_phase[:input_files] if script_phase.key?(:input_files) phase.output_paths = script_phase[:output_files] if script_phase.key?(:output_files) phase.show_env_vars_in_log = script_phase[:show_env_vars_in_log] ? '1' : '0' if script_phase.key?(:show_env_vars_in_log) execution_position = script_phase[:execution_position] unless execution_position == :any compile_build_phase_index = native_target.build_phases.index do |bp| bp.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase) end unless compile_build_phase_index.nil? script_phase_index = native_target.build_phases.index do |bp| bp.is_a?(Xcodeproj::Project::Object::PBXShellScriptBuildPhase) && !bp.name.nil? && bp.name == name_with_prefix end if (execution_position == :before_compile && script_phase_index > compile_build_phase_index) || (execution_position == :after_compile && script_phase_index < compile_build_phase_index) native_target.build_phases.move_from(script_phase_index, compile_build_phase_index) end end end end end |
.output_extension_for_resource(input_extension) ⇒ String
Returns an extension in the target that corresponds to the resource’s input extension.
228 229 230 231 232 233 234 235 236 237 238 239 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 228 def output_extension_for_resource(input_extension) case input_extension when '.storyboard' then '.storyboardc' when '.xib' then '.nib' when '.framework' then '.framework' when '.xcdatamodel' then '.mom' when '.xcdatamodeld' then '.momd' when '.xcmappingmodel' then '.cdm' when '.xcassets' then '.car' else input_extension end end |
.remove_copy_resources_script_phase_from_target(native_target) ⇒ Object
Delete a ‘Copy Pods Resources’ script phase if present
127 128 129 130 131 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 127 def remove_copy_resources_script_phase_from_target(native_target) build_phase = native_target.shell_script_build_phases.find { |bp| bp.name && bp.name.end_with?(COPY_PODS_RESOURCES_PHASE_NAME) } return unless build_phase.present? native_target.build_phases.delete(build_phase) end |
.remove_embed_frameworks_script_phase_from_target(native_target) ⇒ Object
Delete a ‘Embed Pods Frameworks’ Copy Files Build Phase if present
90 91 92 93 94 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 90 def (native_target) = native_target.shell_script_build_phases.find { |bp| bp.name && bp.name.end_with?(EMBED_FRAMEWORK_PHASE_NAME) } return unless .present? native_target.build_phases.delete() end |
.resource_output_paths(resource_input_paths) ⇒ Array<String>
Returns the resource output paths for all given input paths.
248 249 250 251 252 253 254 255 256 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 248 def resource_output_paths(resource_input_paths) resource_input_paths.map do |resource_input_path| base_path = '${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}' extname = File.extname(resource_input_path) basename = extname == '.xcassets' ? 'Assets' : File.basename(resource_input_path) output_extension = TargetIntegrator.output_extension_for_resource(extname) File.join(base_path, File.basename(basename, extname) + output_extension) end.uniq end |
.validate_input_output_path_limit(input_paths, output_paths) ⇒ void
This method returns an undefined value.
Script phases can have a limited number of input and output paths due to each one being exported to ‘env`. A large number can cause a build failure because of limitations in `env`. See issue github.com/CocoaPods/CocoaPods/issues/7362.
213 214 215 216 217 218 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 213 def validate_input_output_path_limit(input_paths, output_paths) if (input_paths.count + output_paths.count) > MAX_INPUT_OUTPUT_PATHS input_paths.clear output_paths.clear end end |
Instance Method Details
#inspect ⇒ String
Returns a string representation suitable for debugging.
280 281 282 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 280 def inspect "#<#{self.class} for target `#{target.label}'>" end |
#integrate! ⇒ void
This method returns an undefined value.
Integrates the user project targets. Only the targets that do not already have the Pods library in their frameworks build phase are processed.
265 266 267 268 269 270 271 272 273 274 275 276 |
# File 'lib/cocoapods/installer/user_project_integrator/target_integrator.rb', line 265 def integrate! UI.section() do XCConfigIntegrator.integrate(target, native_targets) add_pods_library add_copy_resources_script_phase add_check_manifest_lock_script_phase add_user_script_phases end end |