cocoapods 1.10.0 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +261 -5
- data/README.md +11 -11
- data/lib/cocoapods/command/outdated.rb +12 -1
- data/lib/cocoapods/command/repo/push.rb +17 -0
- data/lib/cocoapods/command/spec/cat.rb +3 -1
- data/lib/cocoapods/command/spec/lint.rb +1 -1
- data/lib/cocoapods/command/spec/which.rb +3 -1
- data/lib/cocoapods/command/spec.rb +18 -9
- data/lib/cocoapods/config.rb +1 -1
- data/lib/cocoapods/downloader/cache.rb +95 -6
- data/lib/cocoapods/downloader.rb +4 -2
- data/lib/cocoapods/external_sources/podspec_source.rb +1 -1
- data/lib/cocoapods/gem_version.rb +1 -1
- data/lib/cocoapods/generator/acknowledgements.rb +1 -1
- data/lib/cocoapods/generator/app_target_helper.rb +7 -3
- data/lib/cocoapods/generator/copy_dsyms_script.rb +4 -4
- data/lib/cocoapods/generator/copy_xcframework_script.rb +4 -48
- data/lib/cocoapods/generator/embed_frameworks_script.rb +2 -1
- data/lib/cocoapods/generator/script_phase_constants.rb +1 -0
- data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +31 -4
- data/lib/cocoapods/installer/analyzer.rb +12 -8
- data/lib/cocoapods/installer/podfile_validator.rb +2 -2
- data/lib/cocoapods/installer/pre_integrate_hooks_context.rb +9 -0
- data/lib/cocoapods/installer/project_cache/project_cache_analyzer.rb +9 -2
- data/lib/cocoapods/installer/project_cache/project_installation_cache.rb +15 -2
- data/lib/cocoapods/installer/project_cache/target_cache_key.rb +7 -4
- data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +149 -9
- data/lib/cocoapods/installer/xcode/pods_project_generator/app_host_installer.rb +10 -3
- data/lib/cocoapods/installer/xcode/pods_project_generator/file_references_installer.rb +25 -6
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_dependency_installer.rb +6 -19
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_installer.rb +70 -58
- data/lib/cocoapods/installer/xcode/pods_project_generator/pod_target_integrator.rb +48 -6
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installation_result.rb +2 -2
- data/lib/cocoapods/installer/xcode/pods_project_generator/target_installer.rb +2 -5
- data/lib/cocoapods/installer/xcode/pods_project_generator.rb +1 -1
- data/lib/cocoapods/installer.rb +52 -4
- data/lib/cocoapods/resolver.rb +4 -4
- data/lib/cocoapods/sandbox/file_accessor.rb +57 -10
- data/lib/cocoapods/sandbox/headers_store.rb +3 -1
- data/lib/cocoapods/sandbox/path_list.rb +1 -1
- data/lib/cocoapods/sandbox/pod_dir_cleaner.rb +1 -1
- data/lib/cocoapods/sources_manager.rb +14 -8
- data/lib/cocoapods/target/aggregate_target.rb +23 -1
- data/lib/cocoapods/target/build_settings.rb +45 -20
- data/lib/cocoapods/target/pod_target.rb +47 -22
- data/lib/cocoapods/target.rb +1 -1
- data/lib/cocoapods/user_interface.rb +4 -0
- data/lib/cocoapods/validator.rb +25 -5
- data/lib/cocoapods/version_metadata.rb +1 -1
- data/lib/cocoapods/xcode/xcframework/xcframework_slice.rb +10 -1
- data/lib/cocoapods/xcode/xcframework.rb +8 -3
- metadata +26 -19
@@ -35,7 +35,7 @@ module Pod
|
|
35
35
|
#
|
36
36
|
attr_reader :podfile
|
37
37
|
|
38
|
-
# @return [Lockfile] The Lockfile, if available, that stores the information about the Pods previously installed.
|
38
|
+
# @return [Lockfile, nil] The Lockfile, if available, that stores the information about the Pods previously installed.
|
39
39
|
#
|
40
40
|
attr_reader :lockfile
|
41
41
|
|
@@ -67,7 +67,7 @@ module Pod
|
|
67
67
|
#
|
68
68
|
# @param [Sandbox] sandbox @see #sandbox
|
69
69
|
# @param [Podfile] podfile @see #podfile
|
70
|
-
# @param [Lockfile] lockfile @see #lockfile
|
70
|
+
# @param [Lockfile, nil] lockfile @see #lockfile
|
71
71
|
# @param [Array<Source>] plugin_sources @see #plugin_sources
|
72
72
|
# @param [Boolean] has_dependencies @see #has_dependencies
|
73
73
|
# @param [Hash, Boolean, nil] pods_to_update @see #pods_to_update
|
@@ -565,12 +565,11 @@ module Pod
|
|
565
565
|
pod_targets_by_build_config = Hash.new([].freeze)
|
566
566
|
build_configurations.each { |config| pod_targets_by_build_config[config] = [] }
|
567
567
|
|
568
|
+
dependencies_by_root_name = @podfile_dependency_cache.target_definition_dependencies(target_definition).group_by(&:root_name)
|
569
|
+
|
568
570
|
pod_targets_by_target_definition[target_definition].each do |pod_target|
|
569
571
|
pod_name = pod_target.pod_name
|
570
|
-
|
571
|
-
dependencies = @podfile_dependency_cache.target_definition_dependencies(target_definition).select do |dependency|
|
572
|
-
Specification.root_name(dependency.name) == pod_name
|
573
|
-
end
|
572
|
+
dependencies = dependencies_by_root_name[pod_name] || []
|
574
573
|
|
575
574
|
build_configurations.each do |configuration_name|
|
576
575
|
whitelists = dependencies.map do |dependency|
|
@@ -714,7 +713,12 @@ module Pod
|
|
714
713
|
dependencies.map do |root_spec, deps|
|
715
714
|
pod_targets_by_name[root_spec.name].find do |t|
|
716
715
|
next false if t.platform.symbolic_name != target.platform.symbolic_name ||
|
717
|
-
|
716
|
+
# In the case of variants we must ensure that the platform this target is meant for is the same
|
717
|
+
# as the one we are interested in.
|
718
|
+
t.target_definitions.first.platform != target.target_definitions.first.platform ||
|
719
|
+
# rather than target type or requires_frameworks? since we want to group by what was specified in that
|
720
|
+
# _target definition_.
|
721
|
+
t.build_as_framework? != target.build_as_framework?
|
718
722
|
spec_names = t.specs.map(&:name)
|
719
723
|
deps.all? { |dep| spec_names.include?(dep.name) }
|
720
724
|
end
|
@@ -1115,7 +1119,7 @@ module Pod
|
|
1115
1119
|
def generate_sandbox_state(specifications)
|
1116
1120
|
sandbox_state = nil
|
1117
1121
|
UI.section 'Comparing resolved specification to the sandbox manifest' do
|
1118
|
-
sandbox_analyzer = SandboxAnalyzer.new(sandbox, specifications, update_mode?)
|
1122
|
+
sandbox_analyzer = SandboxAnalyzer.new(sandbox, podfile, specifications, update_mode?)
|
1119
1123
|
sandbox_state = sandbox_analyzer.analyze
|
1120
1124
|
sandbox_state.print
|
1121
1125
|
end
|
@@ -8,11 +8,11 @@ module Pod
|
|
8
8
|
#
|
9
9
|
attr_reader :podfile
|
10
10
|
|
11
|
-
# @return [Array<String>] any errors that have
|
11
|
+
# @return [Array<String>] any errors that have occurred during the validation
|
12
12
|
#
|
13
13
|
attr_reader :errors
|
14
14
|
|
15
|
-
# @return [Array<String>] any warnings that have
|
15
|
+
# @return [Array<String>] any warnings that have occurred during the validation
|
16
16
|
#
|
17
17
|
attr_reader :warnings
|
18
18
|
|
@@ -34,6 +34,10 @@ module Pod
|
|
34
34
|
#
|
35
35
|
attr_reader :aggregate_targets
|
36
36
|
|
37
|
+
# @return [Hash<Symbol, Object>] Hash of installation options.
|
38
|
+
#
|
39
|
+
attr_reader :installation_options
|
40
|
+
|
37
41
|
# @return [Bool] Flag indicating if we want to ignore the cache and force a clean installation.
|
38
42
|
#
|
39
43
|
attr_reader :clean_install
|
@@ -47,9 +51,10 @@ module Pod
|
|
47
51
|
# @param [Hash<String, Hash>] podfile_plugins @see #podfile_plugins
|
48
52
|
# @param [Array<PodTarget>] pod_targets @see #pod_targets
|
49
53
|
# @param [Array<AggregateTarget>] aggregate_targets @see #aggregate_targets
|
54
|
+
# @param [Hash<Symbol, Object>] installation_options @see #installation_options
|
50
55
|
# @param [Bool] clean_install @see #clean_install
|
51
56
|
#
|
52
|
-
def initialize(sandbox, cache, build_configurations, project_object_version, podfile_plugins, pod_targets, aggregate_targets,
|
57
|
+
def initialize(sandbox, cache, build_configurations, project_object_version, podfile_plugins, pod_targets, aggregate_targets, installation_options,
|
53
58
|
clean_install: false)
|
54
59
|
@sandbox = sandbox
|
55
60
|
@cache = cache
|
@@ -58,6 +63,7 @@ module Pod
|
|
58
63
|
@pod_targets = pod_targets
|
59
64
|
@aggregate_targets = aggregate_targets
|
60
65
|
@project_object_version = project_object_version
|
66
|
+
@installation_options = installation_options
|
61
67
|
@clean_install = clean_install
|
62
68
|
end
|
63
69
|
|
@@ -78,7 +84,8 @@ module Pod
|
|
78
84
|
# Bail out early since these properties affect all targets and their associate projects.
|
79
85
|
if cache.build_configurations != build_configurations ||
|
80
86
|
cache.project_object_version != project_object_version ||
|
81
|
-
YAMLHelper.convert(cache.podfile_plugins) != YAMLHelper.convert(podfile_plugins)
|
87
|
+
YAMLHelper.convert(cache.podfile_plugins) != YAMLHelper.convert(podfile_plugins) ||
|
88
|
+
YAMLHelper.convert(cache.installation_options) != YAMLHelper.convert(installation_options)
|
82
89
|
UI.message 'Ignoring project cache due to project configuration changes.'
|
83
90
|
return full_install_results
|
84
91
|
end
|
@@ -26,18 +26,25 @@ module Pod
|
|
26
26
|
#
|
27
27
|
attr_reader :podfile_plugins
|
28
28
|
|
29
|
+
# @return [Hash<Symbol, Object>]
|
30
|
+
# Configured installation options
|
31
|
+
#
|
32
|
+
attr_reader :installation_options
|
33
|
+
|
29
34
|
# Initializes a new instance.
|
30
35
|
#
|
31
36
|
# @param [Hash{String => TargetCacheKey}] cache_key_by_target_label @see #cache_key_by_target_label
|
32
37
|
# @param [Hash{String => Symbol}] build_configurations @see #build_configurations
|
33
38
|
# @param [Integer] project_object_version @see #project_object_version
|
34
39
|
# @param [Hash<String, Hash>] podfile_plugins @see #podfile_plugins
|
40
|
+
# @param [Hash<Symbol, Object>] installation_options @see #installation_options
|
35
41
|
#
|
36
|
-
def initialize(cache_key_by_target_label = {}, build_configurations = nil, project_object_version = nil, podfile_plugins = {})
|
42
|
+
def initialize(cache_key_by_target_label = {}, build_configurations = nil, project_object_version = nil, podfile_plugins = {}, installation_options = {})
|
37
43
|
@cache_key_by_target_label = cache_key_by_target_label
|
38
44
|
@build_configurations = build_configurations
|
39
45
|
@project_object_version = project_object_version
|
40
46
|
@podfile_plugins = podfile_plugins
|
47
|
+
@installation_options = installation_options
|
41
48
|
end
|
42
49
|
|
43
50
|
def update_cache_key_by_target_label!(cache_key_by_target_label)
|
@@ -56,6 +63,10 @@ module Pod
|
|
56
63
|
@podfile_plugins = podfile_plugins
|
57
64
|
end
|
58
65
|
|
66
|
+
def update_installation_options!(installation_options)
|
67
|
+
@installation_options = installation_options
|
68
|
+
end
|
69
|
+
|
59
70
|
def save_as(path)
|
60
71
|
Pathname(path).dirname.mkpath
|
61
72
|
Sandbox.update_changed_file(path, YAMLHelper.convert(to_hash))
|
@@ -71,7 +82,8 @@ module Pod
|
|
71
82
|
project_object_version = contents['OBJECT_VERSION']
|
72
83
|
build_configurations = contents['BUILD_CONFIGURATIONS']
|
73
84
|
podfile_plugins = contents['PLUGINS']
|
74
|
-
|
85
|
+
installation_options = contents['INSTALLATION_OPTIONS']
|
86
|
+
ProjectInstallationCache.new(cache_key_by_target_label, build_configurations, project_object_version, podfile_plugins, installation_options)
|
75
87
|
end
|
76
88
|
|
77
89
|
def to_hash
|
@@ -82,6 +94,7 @@ module Pod
|
|
82
94
|
contents['BUILD_CONFIGURATIONS'] = build_configurations if build_configurations
|
83
95
|
contents['OBJECT_VERSION'] = project_object_version if project_object_version
|
84
96
|
contents['PLUGINS'] = podfile_plugins if podfile_plugins
|
97
|
+
contents['INSTALLATION_OPTIONS'] = installation_options if installation_options
|
85
98
|
contents
|
86
99
|
end
|
87
100
|
end
|
@@ -136,7 +136,7 @@ module Pod
|
|
136
136
|
'PROJECT_NAME' => pod_target.project_name,
|
137
137
|
}
|
138
138
|
if is_local_pod
|
139
|
-
relative_file_paths = pod_target.all_files.map { |f|
|
139
|
+
relative_file_paths = pod_target.all_files.map { |f| f.relative_path_from(sandbox.root).to_s }
|
140
140
|
contents['FILES'] = relative_file_paths.sort_by(&:downcase)
|
141
141
|
end
|
142
142
|
contents['CHECKOUT_OPTIONS'] = checkout_options if checkout_options
|
@@ -161,9 +161,12 @@ module Pod
|
|
161
161
|
contents = {
|
162
162
|
'BUILD_SETTINGS_CHECKSUM' => build_settings,
|
163
163
|
}
|
164
|
-
if aggregate_target.includes_resources?
|
165
|
-
|
166
|
-
|
164
|
+
if aggregate_target.includes_resources? || aggregate_target.includes_on_demand_resources?
|
165
|
+
relative_resource_file_paths = aggregate_target.resource_paths_by_config.values.flatten.uniq
|
166
|
+
relative_on_demand_resource_file_paths = aggregate_target.on_demand_resources.map do |res|
|
167
|
+
res.relative_path_from(sandbox.project_path.dirname).to_s
|
168
|
+
end
|
169
|
+
contents['FILES'] = (relative_resource_file_paths + relative_on_demand_resource_file_paths).sort_by(&:downcase)
|
167
170
|
end
|
168
171
|
TargetCacheKey.new(sandbox, :aggregate, contents)
|
169
172
|
end
|
@@ -32,7 +32,8 @@ module Pod
|
|
32
32
|
# For messages extensions, this only applies if it's embedded in a messages
|
33
33
|
# application.
|
34
34
|
#
|
35
|
-
EMBED_FRAMEWORK_TARGET_TYPES = [:application, :application_on_demand_install_capable, :unit_test_bundle,
|
35
|
+
EMBED_FRAMEWORK_TARGET_TYPES = [:application, :application_on_demand_install_capable, :unit_test_bundle,
|
36
|
+
:ui_test_bundle, :watch2_extension, :messages_application].freeze
|
36
37
|
|
37
38
|
# @return [String] the name of the embed frameworks phase
|
38
39
|
#
|
@@ -326,11 +327,18 @@ module Pod
|
|
326
327
|
|
327
328
|
def reorder_script_phase(native_target, script_phase, execution_position)
|
328
329
|
return if execution_position == :any || execution_position.to_s.empty?
|
329
|
-
target_phase_type =
|
330
|
+
target_phase_type = case execution_position
|
331
|
+
when :before_compile, :after_compile
|
332
|
+
Xcodeproj::Project::Object::PBXSourcesBuildPhase
|
333
|
+
when :before_headers, :after_headers
|
334
|
+
Xcodeproj::Project::Object::PBXHeadersBuildPhase
|
335
|
+
else
|
336
|
+
raise ArgumentError, "Unknown execution position `#{execution_position}`"
|
337
|
+
end
|
330
338
|
order_before = case execution_position
|
331
|
-
when :before_compile
|
339
|
+
when :before_compile, :before_headers
|
332
340
|
true
|
333
|
-
when :after_compile
|
341
|
+
when :after_compile, :after_headers
|
334
342
|
false
|
335
343
|
else
|
336
344
|
raise ArgumentError, "Unknown execution position `#{execution_position}`"
|
@@ -387,10 +395,10 @@ module Pod
|
|
387
395
|
|
388
396
|
# Returns the framework input paths for the given framework paths
|
389
397
|
#
|
390
|
-
# @param [
|
398
|
+
# @param [Array<Xcode::FrameworkPaths>] framework_paths
|
391
399
|
# The target's framework paths to map to input paths.
|
392
400
|
#
|
393
|
-
# @param [
|
401
|
+
# @param [Array<XCFramework>] xcframeworks
|
394
402
|
# The target's xcframeworks to map to input paths.
|
395
403
|
#
|
396
404
|
# @return [Array<String>] The embed frameworks script input paths
|
@@ -426,6 +434,119 @@ module Pod
|
|
426
434
|
end
|
427
435
|
paths + xcframework_paths
|
428
436
|
end
|
437
|
+
|
438
|
+
# Updates a projects native targets to include on demand resources specified by the supplied parameters.
|
439
|
+
# Note that currently, only app level targets are allowed to include on demand resources.
|
440
|
+
#
|
441
|
+
# @param [Sandbox] sandbox
|
442
|
+
# The sandbox to use for calculating ODR file references.
|
443
|
+
#
|
444
|
+
# @param [Xcodeproj::Project] project
|
445
|
+
# The project to update known asset tags as well as add the ODR group.
|
446
|
+
#
|
447
|
+
# @param [Xcodeproj::PBXNativeTarget, Array<Xcodeproj::PBXNativeTarget>] native_targets
|
448
|
+
# The native targets to integrate on demand resources into.
|
449
|
+
#
|
450
|
+
# @param [Sandbox::FileAccessor, Array<Sandbox::FileAccessor>] file_accessors
|
451
|
+
# The file accessors that that provide the ODRs to integrate.
|
452
|
+
#
|
453
|
+
# @param [Xcodeproj::PBXGroup] parent_odr_group
|
454
|
+
# The group to use as the parent to add ODR file references into.
|
455
|
+
#
|
456
|
+
# @param [String] target_odr_group_name
|
457
|
+
# The name to use for the group created that contains the ODR file references.
|
458
|
+
#
|
459
|
+
# @return [void]
|
460
|
+
#
|
461
|
+
def update_on_demand_resources(sandbox, project, native_targets, file_accessors, parent_odr_group,
|
462
|
+
target_odr_group_name)
|
463
|
+
category_to_tags = {}
|
464
|
+
file_accessors = Array(file_accessors)
|
465
|
+
native_targets = Array(native_targets)
|
466
|
+
|
467
|
+
# Target no longer provides ODR references so remove everything related to this target.
|
468
|
+
if file_accessors.all? { |fa| fa.on_demand_resources.empty? }
|
469
|
+
old_target_odr_group = parent_odr_group[target_odr_group_name]
|
470
|
+
old_odr_file_refs = old_target_odr_group&.recursive_children_groups&.each_with_object({}) do |group, hash|
|
471
|
+
hash[group.name] = group.files
|
472
|
+
end || {}
|
473
|
+
native_targets.each do |native_target|
|
474
|
+
native_target.remove_on_demand_resources(old_odr_file_refs)
|
475
|
+
update_on_demand_resources_build_settings(native_target, nil => old_odr_file_refs.keys)
|
476
|
+
end
|
477
|
+
old_target_odr_group&.remove_from_project
|
478
|
+
return
|
479
|
+
end
|
480
|
+
|
481
|
+
target_odr_group = parent_odr_group[target_odr_group_name] || parent_odr_group.new_group(target_odr_group_name)
|
482
|
+
current_file_refs = target_odr_group.recursive_children_groups.flat_map(&:files)
|
483
|
+
|
484
|
+
added_file_refs = file_accessors.flat_map do |file_accessor|
|
485
|
+
target_odr_files_refs = Hash[file_accessor.on_demand_resources.map do |tag, value|
|
486
|
+
tag_group = target_odr_group[tag] || target_odr_group.new_group(tag)
|
487
|
+
category_to_tags[value[:category]] ||= []
|
488
|
+
category_to_tags[value[:category]] << tag
|
489
|
+
resources_file_refs = value[:paths].map do |resource|
|
490
|
+
odr_resource_file_ref = Pathname.new(resource).relative_path_from(sandbox.root)
|
491
|
+
tag_group.find_file_by_path(odr_resource_file_ref.to_s) || tag_group.new_file(odr_resource_file_ref)
|
492
|
+
end
|
493
|
+
[tag, resources_file_refs]
|
494
|
+
end]
|
495
|
+
native_targets.each do |native_target|
|
496
|
+
native_target.add_on_demand_resources(target_odr_files_refs)
|
497
|
+
end
|
498
|
+
target_odr_files_refs.values.flatten
|
499
|
+
end
|
500
|
+
|
501
|
+
# if the target ODR file references were updated, make sure we remove the ones that are no longer present
|
502
|
+
# for the target.
|
503
|
+
remaining_refs = current_file_refs - added_file_refs
|
504
|
+
remaining_refs.each do |ref|
|
505
|
+
native_targets.each do |user_target|
|
506
|
+
user_target.resources_build_phase.remove_file_reference(ref)
|
507
|
+
end
|
508
|
+
ref.remove_from_project
|
509
|
+
end
|
510
|
+
target_odr_group.recursive_children_groups.each { |g| g.remove_from_project if g.empty? }
|
511
|
+
|
512
|
+
attributes = project.root_object.attributes
|
513
|
+
attributes['KnownAssetTags'] = (attributes['KnownAssetTags'] ||= []) | category_to_tags.values.flatten
|
514
|
+
project.root_object.attributes = attributes
|
515
|
+
|
516
|
+
native_targets.each do |native_target|
|
517
|
+
update_on_demand_resources_build_settings(native_target, category_to_tags)
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
def update_on_demand_resources_build_settings(native_target, category_to_tags)
|
522
|
+
%w[ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS ON_DEMAND_RESOURCES_PREFETCH_ORDER].each do |category_key|
|
523
|
+
native_target.build_configurations.each do |c|
|
524
|
+
key = case category_key
|
525
|
+
when 'ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS'
|
526
|
+
:initial_install
|
527
|
+
when 'ON_DEMAND_RESOURCES_PREFETCH_ORDER'
|
528
|
+
:prefetched
|
529
|
+
else
|
530
|
+
:download_on_demand
|
531
|
+
end
|
532
|
+
tags_for_category = (c.build_settings[category_key] || '').split
|
533
|
+
category_to_tags_dup = category_to_tags.dup
|
534
|
+
tags_to_add = category_to_tags_dup.delete(key) || []
|
535
|
+
tags_to_delete = category_to_tags_dup.values.flatten
|
536
|
+
tags_for_category = (tags_for_category + tags_to_add - tags_to_delete).flatten.compact.uniq
|
537
|
+
if tags_for_category.empty?
|
538
|
+
val = c.build_settings.delete(category_key)
|
539
|
+
native_target.project.mark_dirty! unless val.nil?
|
540
|
+
else
|
541
|
+
tags = tags_for_category.join(' ')
|
542
|
+
unless c.build_settings[category_key] == tags
|
543
|
+
c.build_settings[category_key] = tags
|
544
|
+
native_target.project.mark_dirty!
|
545
|
+
end
|
546
|
+
end
|
547
|
+
end
|
548
|
+
end
|
549
|
+
end
|
429
550
|
end
|
430
551
|
|
431
552
|
# Integrates the user project targets. Only the targets that do **not**
|
@@ -445,6 +566,7 @@ module Pod
|
|
445
566
|
add_copy_resources_script_phase
|
446
567
|
add_check_manifest_lock_script_phase
|
447
568
|
add_user_script_phases
|
569
|
+
add_on_demand_resources
|
448
570
|
end
|
449
571
|
end
|
450
572
|
|
@@ -509,10 +631,12 @@ module Pod
|
|
509
631
|
output_paths_by_config = {}
|
510
632
|
if use_input_output_paths
|
511
633
|
target.resource_paths_by_config.each do |config, resource_paths|
|
512
|
-
input_paths_key = XCFileListConfigKey.new(target.copy_resources_script_input_files_path(config),
|
634
|
+
input_paths_key = XCFileListConfigKey.new(target.copy_resources_script_input_files_path(config),
|
635
|
+
target.copy_resources_script_input_files_relative_path)
|
513
636
|
input_paths_by_config[input_paths_key] = [script_path] + resource_paths
|
514
637
|
|
515
|
-
output_paths_key = XCFileListConfigKey.new(target.copy_resources_script_output_files_path(config),
|
638
|
+
output_paths_key = XCFileListConfigKey.new(target.copy_resources_script_output_files_path(config),
|
639
|
+
target.copy_resources_script_output_files_relative_path)
|
516
640
|
output_paths_by_config[output_paths_key] = TargetIntegrator.resource_output_paths(resource_paths)
|
517
641
|
end
|
518
642
|
end
|
@@ -520,7 +644,9 @@ module Pod
|
|
520
644
|
native_targets.each do |native_target|
|
521
645
|
# Static library targets cannot include resources. Skip this phase from being added instead.
|
522
646
|
next if native_target.symbol_type == :static_library
|
523
|
-
TargetIntegrator.create_or_update_copy_resources_script_phase_to_target(native_target, script_path,
|
647
|
+
TargetIntegrator.create_or_update_copy_resources_script_phase_to_target(native_target, script_path,
|
648
|
+
input_paths_by_config,
|
649
|
+
output_paths_by_config)
|
524
650
|
end
|
525
651
|
end
|
526
652
|
|
@@ -624,6 +750,20 @@ module Pod
|
|
624
750
|
end
|
625
751
|
end
|
626
752
|
|
753
|
+
def add_on_demand_resources
|
754
|
+
target.pod_targets.each do |pod_target|
|
755
|
+
# When integrating with the user's project we are only interested in integrating ODRs from library specs
|
756
|
+
# and not test specs or app specs.
|
757
|
+
library_file_accessors = pod_target.file_accessors.select { |fa| fa.spec.library_specification? }
|
758
|
+
target_odr_group_name = "#{pod_target.label}-OnDemandResources"
|
759
|
+
# The 'Pods' group would always be there for production code however for tests its sometimes not added.
|
760
|
+
# This ensures its always present and makes it easier for existing and new tests.
|
761
|
+
parent_odr_group = target.user_project.main_group['Pods'] || target.user_project.new_group('Pods')
|
762
|
+
TargetIntegrator.update_on_demand_resources(target.sandbox, target.user_project, target.user_targets,
|
763
|
+
library_file_accessors, parent_odr_group, target_odr_group_name)
|
764
|
+
end
|
765
|
+
end
|
766
|
+
|
627
767
|
private
|
628
768
|
|
629
769
|
# @!group Private Helpers
|
@@ -45,6 +45,11 @@ module Pod
|
|
45
45
|
#
|
46
46
|
attr_reader :info_plist_entries
|
47
47
|
|
48
|
+
# @return [String] product_basename
|
49
|
+
# The product basename to use for the target.
|
50
|
+
#
|
51
|
+
attr_reader :product_basename
|
52
|
+
|
48
53
|
# Initialize a new instance
|
49
54
|
#
|
50
55
|
# @param [Sandbox] sandbox @see #sandbox
|
@@ -55,8 +60,9 @@ module Pod
|
|
55
60
|
# @param [String] app_target_label see #app_target_label
|
56
61
|
# @param [Boolean] add_main see #add_main
|
57
62
|
# @param [Hash] info_plist_entries see #info_plist_entries
|
63
|
+
# @param [String] product_basename see #product_basename
|
58
64
|
#
|
59
|
-
def initialize(sandbox, project, platform, subgroup_name, group_name, app_target_label, add_main: true, add_launchscreen_storyboard: platform == :ios, info_plist_entries: {})
|
65
|
+
def initialize(sandbox, project, platform, subgroup_name, group_name, app_target_label, add_main: true, add_launchscreen_storyboard: platform == :ios, info_plist_entries: {}, product_basename: nil)
|
60
66
|
@sandbox = sandbox
|
61
67
|
@project = project
|
62
68
|
@platform = platform
|
@@ -66,6 +72,7 @@ module Pod
|
|
66
72
|
@add_main = add_main
|
67
73
|
@add_launchscreen_storyboard = add_launchscreen_storyboard
|
68
74
|
@info_plist_entries = info_plist_entries
|
75
|
+
@product_basename = product_basename || app_target_label
|
69
76
|
target_group = project.pod_group(group_name)
|
70
77
|
@group = target_group[subgroup_name] || target_group.new_group(subgroup_name)
|
71
78
|
end
|
@@ -75,9 +82,9 @@ module Pod
|
|
75
82
|
def install!
|
76
83
|
platform_name = platform.name
|
77
84
|
app_host_target = Pod::Generator::AppTargetHelper.add_app_target(project, platform_name, deployment_target,
|
78
|
-
app_target_label)
|
85
|
+
app_target_label, product_basename)
|
79
86
|
app_host_target.build_configurations.each do |configuration|
|
80
|
-
configuration.build_settings['PRODUCT_NAME'] =
|
87
|
+
configuration.build_settings['PRODUCT_NAME'] = product_basename
|
81
88
|
configuration.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}'
|
82
89
|
if platform == :osx
|
83
90
|
configuration.build_settings['CODE_SIGN_IDENTITY'] = ''
|