cocoapods-generate 1.6.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +8 -0
- data/VERSION +1 -1
- data/lib/cocoapods/command/gen.rb +6 -4
- data/lib/cocoapods/generate/configuration.rb +35 -11
- data/lib/cocoapods/generate/installer.rb +144 -59
- data/lib/cocoapods/generate/podfile_generator.rb +96 -54
- data/lib/cocoapods_plugin.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2145be6fd1f163f41cdd8bcba9ea779ae778d1fe23f01f73fd21bc6303c289a6
|
4
|
+
data.tar.gz: 46d4ba1d2f392403d8e24d82f0c1ff305df62ea42cdde91ea0587400d6a3e484
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d62df5b33c54a60348728eb036c47aa22ce1c52a120dc6de294ab4577a08b014cd748b29738a5ab498c7df4cf1f131252153cfa4575f4e6a6c1a564d37a3360
|
7
|
+
data.tar.gz: 733dfed2775abdb8d93f6c33e9d1ee14a1089d4d0719e0decac5d82bf8c08a3a6f250dee4d7ff8f69c5eb252f9cb2ee6391ff8d6730896a2872a13f6b06f6a8a
|
data/README.md
CHANGED
@@ -47,6 +47,7 @@ Usage:
|
|
47
47
|
|
48
48
|
Options:
|
49
49
|
|
50
|
+
--allow-root Allows CocoaPods to run as root
|
50
51
|
--silent Show nothing
|
51
52
|
--verbose Show more debugging information
|
52
53
|
--no-ansi Show output without ANSI codes
|
@@ -88,6 +89,9 @@ Options:
|
|
88
89
|
default plugins
|
89
90
|
--deterministic-uuids Whether installation should use
|
90
91
|
deterministic UUIDs for pods projects
|
92
|
+
--disable-input-output-paths Whether to disable the input & output paths
|
93
|
+
of the CocoaPods script phases (Copy
|
94
|
+
Frameworks & Copy Resources)
|
91
95
|
--share-schemes-for-development-pods Whether installation should share schemes
|
92
96
|
for development pods
|
93
97
|
--warn-for-multiple-pod-sources Whether installation should warn when a pod
|
@@ -97,6 +101,10 @@ Options:
|
|
97
101
|
modules, as if `use_modular_headers!` were
|
98
102
|
specified. Will error if both this option
|
99
103
|
and a podfile are specified
|
104
|
+
--single-workspace Whether to produce a single workspace for
|
105
|
+
all podspecs specified.
|
106
|
+
--xcode-version=xcode_version The Xcode version to use for producing the
|
107
|
+
consumer sample project
|
100
108
|
```
|
101
109
|
<!-- end cli usage -->
|
102
110
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.2.0
|
@@ -64,8 +64,8 @@ module Pod
|
|
64
64
|
# even if there are multiple podspecs
|
65
65
|
update_sources if configuration.repo_update?
|
66
66
|
|
67
|
-
Generate::PodfileGenerator.new(configuration).
|
68
|
-
Generate::Installer.new(configuration,
|
67
|
+
Generate::PodfileGenerator.new(configuration).podfiles_by_specs.each do |specs, podfile|
|
68
|
+
Generate::Installer.new(configuration, specs, podfile).install!
|
69
69
|
end
|
70
70
|
|
71
71
|
remove_warnings(UI.warnings)
|
@@ -86,10 +86,12 @@ module Pod
|
|
86
86
|
path = dir + '.gen_config.yml'
|
87
87
|
next unless path.file?
|
88
88
|
Pod::Generate::Configuration.from_file(path)
|
89
|
-
end
|
89
|
+
end.compact
|
90
|
+
|
91
|
+
options.delete(:podspec_paths) if options[:podspec_paths].empty? && config_hashes.any? { |h| h.include?(:podspec_paths) }
|
90
92
|
|
91
93
|
env = Generate::Configuration.from_env(ENV)
|
92
|
-
config_hashes
|
94
|
+
config_hashes = [env] + config_hashes
|
93
95
|
config_hashes << options
|
94
96
|
|
95
97
|
configuration = config_hashes.compact.each_with_object({}) { |e, h| h.merge!(e) }
|
@@ -123,6 +123,10 @@ module Pod
|
|
123
123
|
value
|
124
124
|
end
|
125
125
|
|
126
|
+
coerce_to_version = lambda do |value|
|
127
|
+
Pod::Version.new(value)
|
128
|
+
end
|
129
|
+
|
126
130
|
coerce_to_pathname = lambda do |path|
|
127
131
|
path && Pathname(path).expand_path
|
128
132
|
end
|
@@ -169,7 +173,7 @@ module Pod
|
|
169
173
|
->(paths) { ('paths do not exist' unless paths.all? { |p| p.is_a?(URI) || p.exist? }) },
|
170
174
|
->(paths) { paths && paths.map { |path| path.to_s =~ %r{https?://} ? URI(path) : Pathname(path).expand_path } }
|
171
175
|
option :podspecs, ArrayOf.new(Pod::Specification),
|
172
|
-
'self.class.podspecs_from_paths(podspec_paths)',
|
176
|
+
'self.class.podspecs_from_paths(podspec_paths, gen_directory)',
|
173
177
|
nil,
|
174
178
|
nil,
|
175
179
|
->(specs) { 'no podspecs found' if specs.empty? },
|
@@ -199,10 +203,13 @@ module Pod
|
|
199
203
|
->(platforms) { Array(platforms).flat_map { |s| s.split(',') } }
|
200
204
|
option :repo_update, BOOLEAN, 'false', 'Force running `pod repo update` before install', nil, nil, coerce_to_bool
|
201
205
|
option :use_default_plugins, BOOLEAN, 'false', 'Whether installation should activate default plugins', nil, nil, coerce_to_bool
|
202
|
-
option :deterministic_uuids, BOOLEAN, 'false', 'Whether installation should use deterministic UUIDs for pods projects', nil, nil, coerce_to_bool
|
203
|
-
option :
|
204
|
-
option :
|
206
|
+
option :deterministic_uuids, BOOLEAN, '(use_podfile && podfile) ? podfile.installation_options.deterministic_uuids : false', 'Whether installation should use deterministic UUIDs for pods projects', nil, nil, coerce_to_bool
|
207
|
+
option :disable_input_output_paths, BOOLEAN, '(use_podfile && podfile) ? podfile.installation_options.disable_input_output_paths : false', 'Whether to disable the input & output paths of the CocoaPods script phases (Copy Frameworks & Copy Resources)', nil, nil, coerce_to_bool
|
208
|
+
option :share_schemes_for_development_pods, [TrueClass, FalseClass, Array], '(use_podfile && podfile) ? podfile.installation_options.share_schemes_for_development_pods : true', 'Whether installation should share schemes for development pods', nil, nil
|
209
|
+
option :warn_for_multiple_pod_sources, BOOLEAN, '(use_podfile && podfile) ? podfile.installation_options.warn_for_multiple_pod_sources : false', 'Whether installation should warn when a pod is found in multiple sources', nil, nil, coerce_to_bool
|
205
210
|
option :use_modular_headers, BOOLEAN, 'false', 'Whether the target should be generated as a clang module, treating dependencies as modules, as if `use_modular_headers!` were specified. Will error if both this option and a podfile are specified', nil, nil, coerce_to_bool
|
211
|
+
option :single_workspace, BOOLEAN, 'false', 'Whether to produce a single workspace for all podspecs specified.', nil, nil, coerce_to_bool
|
212
|
+
option :xcode_version, Pod::Version, 'Pod::Version.new(\'9.3\')', 'The Xcode version to use for producing the consumer sample project', 'xcode_version', nil, coerce_to_version
|
206
213
|
|
207
214
|
options.freeze
|
208
215
|
options.each do |o|
|
@@ -302,12 +309,13 @@ module Pod
|
|
302
309
|
end << ' }'
|
303
310
|
end
|
304
311
|
|
305
|
-
# @return [Pathname] the directory for installation of the generated workspace
|
312
|
+
# @return [Pathname] the directory for installation of the generated workspace.
|
306
313
|
#
|
307
|
-
# @param [
|
314
|
+
# @param [Array<Specification>] specs The specs to get a directory name for.
|
308
315
|
#
|
309
|
-
def
|
310
|
-
|
316
|
+
def gen_dir_for_specs(specs)
|
317
|
+
basename = specs.count == 1 ? specs.first.name : 'Workspace'
|
318
|
+
gen_directory.join(basename)
|
311
319
|
end
|
312
320
|
|
313
321
|
# @return [Boolean] whether gen should install with dynamic frameworks
|
@@ -316,13 +324,29 @@ module Pod
|
|
316
324
|
!use_libraries?
|
317
325
|
end
|
318
326
|
|
327
|
+
# @return [String] The project name to use for generating this workspace.
|
328
|
+
#
|
329
|
+
# @param [Array<Specification>] specs
|
330
|
+
# the specifications to generate project name for.
|
331
|
+
#
|
332
|
+
def project_name_for_specs(specs)
|
333
|
+
project_name = specs.count == 1 ? +specs.first.name.dup : +'Workspace'
|
334
|
+
# When using multiple Xcode project the project name will collide with the actual .xcodeproj meant for the pod
|
335
|
+
# that we are generating the workspace for.
|
336
|
+
project_name << 'Sample' if generate_multiple_pod_projects? && specs.count == 1
|
337
|
+
project_name
|
338
|
+
end
|
339
|
+
|
319
340
|
# @return [Array<Specification>] the podspecs found at the given paths.
|
320
341
|
# This method will download specs from URLs and traverse a directory's children.
|
321
342
|
#
|
322
343
|
# @param [Array<Pathname,URI>] paths
|
323
344
|
# the paths to search for podspecs
|
324
345
|
#
|
325
|
-
|
346
|
+
# @param [Pathname] gen_directory
|
347
|
+
# the directory that the gen installation would occur into.
|
348
|
+
#
|
349
|
+
def self.podspecs_from_paths(paths, gen_directory)
|
326
350
|
paths = [Pathname('.')] if paths.empty?
|
327
351
|
paths.flat_map do |path|
|
328
352
|
if path.is_a?(URI)
|
@@ -338,9 +362,9 @@ module Pod
|
|
338
362
|
$ERROR_INFO
|
339
363
|
end
|
340
364
|
elsif path.directory?
|
341
|
-
glob = Pathname.glob(path + '
|
365
|
+
glob = Pathname.glob(path.expand_path + '**/*.podspec{.json,}').select { |f| f.relative_path_from(gen_directory).to_s.start_with?('..') }
|
342
366
|
next StandardError.new "no specs found in #{UI.path path}" if glob.empty?
|
343
|
-
glob.map { |f| Pod::Specification.from_file(f) }
|
367
|
+
glob.map { |f| Pod::Specification.from_file(f) }.sort_by(&:name)
|
344
368
|
else
|
345
369
|
Pod::Specification.from_file(path)
|
346
370
|
end
|
@@ -4,24 +4,38 @@ module Pod
|
|
4
4
|
# given a configuration and a generated podfile.
|
5
5
|
#
|
6
6
|
class Installer
|
7
|
+
DEFAULT_XCODE_VERSION = '9.3'.freeze
|
8
|
+
|
9
|
+
XCODE_VERSION_TO_OBJECT_VERSION = {
|
10
|
+
'12.0' => 54,
|
11
|
+
'11.4' => 53,
|
12
|
+
'11.0' => 52,
|
13
|
+
'10.0' => 51,
|
14
|
+
'9.3' => 50,
|
15
|
+
'8.0' => 48,
|
16
|
+
'6.3' => 47,
|
17
|
+
'3.2' => 46,
|
18
|
+
'3.1' => 45
|
19
|
+
}.freeze
|
20
|
+
|
7
21
|
# @return [Configuration]
|
8
22
|
# the configuration to use when installing
|
9
23
|
#
|
10
24
|
attr_reader :configuration
|
11
25
|
|
12
|
-
# @return [Specification]
|
26
|
+
# @return [Array<Specification>]
|
13
27
|
# the spec whose workspace is being created
|
14
28
|
#
|
15
|
-
attr_reader :
|
29
|
+
attr_reader :specs
|
16
30
|
|
17
31
|
# @return [Podfile]
|
18
32
|
# the podfile to install
|
19
33
|
#
|
20
34
|
attr_reader :podfile
|
21
35
|
|
22
|
-
def initialize(configuration,
|
36
|
+
def initialize(configuration, specs, podfile)
|
23
37
|
@configuration = configuration
|
24
|
-
@
|
38
|
+
@specs = specs
|
25
39
|
@podfile = podfile
|
26
40
|
end
|
27
41
|
|
@@ -37,7 +51,7 @@ module Pod
|
|
37
51
|
# @return [void]
|
38
52
|
#
|
39
53
|
def install!
|
40
|
-
UI.title "Generating
|
54
|
+
UI.title "Generating workspace in #{UI.path install_directory}" do
|
41
55
|
clean! if configuration.clean?
|
42
56
|
install_directory.mkpath
|
43
57
|
|
@@ -51,7 +65,12 @@ module Pod
|
|
51
65
|
|
52
66
|
installer = nil
|
53
67
|
UI.section 'Installing...' do
|
54
|
-
configuration.pod_config.with_changes(installation_root: install_directory, podfile: podfile,
|
68
|
+
configuration.pod_config.with_changes(installation_root: install_directory, podfile: podfile,
|
69
|
+
lockfile: configuration.lockfile, sandbox: nil,
|
70
|
+
sandbox_root: install_directory + 'Pods',
|
71
|
+
podfile_path: podfile.defined_in_file,
|
72
|
+
silent: !configuration.pod_config.verbose?, verbose: false,
|
73
|
+
lockfile_path: nil) do
|
55
74
|
installer = ::Pod::Installer.new(configuration.pod_config.sandbox, podfile, configuration.lockfile)
|
56
75
|
installer.use_default_plugins = configuration.use_default_plugins
|
57
76
|
installer.install!
|
@@ -59,7 +78,12 @@ module Pod
|
|
59
78
|
end
|
60
79
|
|
61
80
|
UI.section 'Performing post-installation steps' do
|
62
|
-
|
81
|
+
should_perform_post_install = if installer.respond_to?(:generated_aggregate_targets) # CocoaPods 1.7.0
|
82
|
+
!installer.generated_aggregate_targets.empty?
|
83
|
+
else
|
84
|
+
true
|
85
|
+
end
|
86
|
+
perform_post_install_steps(open_app_project, installer) if should_perform_post_install
|
63
87
|
end
|
64
88
|
|
65
89
|
print_post_install_message
|
@@ -79,11 +103,15 @@ module Pod
|
|
79
103
|
end
|
80
104
|
|
81
105
|
def open_app_project(recreate: false)
|
82
|
-
app_project_path = install_directory.join("#{
|
106
|
+
app_project_path = install_directory.join("#{configuration.project_name_for_specs(specs)}.xcodeproj")
|
83
107
|
if !recreate && app_project_path.exist?
|
84
108
|
Xcodeproj::Project.open(app_project_path)
|
85
109
|
else
|
86
|
-
|
110
|
+
version_key = XCODE_VERSION_TO_OBJECT_VERSION.keys.find do |k|
|
111
|
+
configuration.xcode_version >= Pod::Version.new(k)
|
112
|
+
end || DEFAULT_XCODE_VERSION
|
113
|
+
object_version = XCODE_VERSION_TO_OBJECT_VERSION[version_key]
|
114
|
+
Xcodeproj::Project.new(app_project_path, false, object_version)
|
87
115
|
end
|
88
116
|
end
|
89
117
|
|
@@ -92,25 +120,34 @@ module Pod
|
|
92
120
|
# @return [Xcodeproj::Project]
|
93
121
|
#
|
94
122
|
def create_app_project
|
95
|
-
app_project = open_app_project(recreate:
|
123
|
+
app_project = open_app_project(recreate: !configuration.incremental_installation?)
|
124
|
+
|
125
|
+
platforms_by_spec = Hash[specs.map do |spec|
|
126
|
+
platforms = spec.available_platforms.flatten.reject do |platform|
|
127
|
+
!configuration.platforms.nil? && !configuration.platforms.include?(platform.string_name.downcase)
|
128
|
+
end
|
129
|
+
[spec, platforms]
|
130
|
+
end]
|
96
131
|
|
97
|
-
|
98
|
-
!
|
132
|
+
if platforms_by_spec.values.all?(&:empty?)
|
133
|
+
Pod::Command::Gen.help! Pod::StandardError.new "No available platforms for podspecs #{specs.map(&:name).to_sentence} match requested platforms: #{configuration.platforms}"
|
99
134
|
end
|
100
135
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
136
|
+
platforms_by_spec
|
137
|
+
.flat_map do |spec, platforms|
|
138
|
+
platforms.map do |platform|
|
139
|
+
consumer = spec.consumer(platform)
|
140
|
+
target_name = "App-#{Platform.string_name(consumer.platform_name)}"
|
141
|
+
next if app_project.targets.map(&:name).include? target_name
|
142
|
+
native_app_target = Pod::Generator::AppTargetHelper.add_app_target(app_project, consumer.platform_name,
|
143
|
+
deployment_target(consumer), target_name)
|
144
|
+
# Temporarily set Swift version to pass validator checks for pods which do not specify Swift version.
|
145
|
+
# It will then be re-set again within #perform_post_install_steps.
|
146
|
+
Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, Pod::Validator::DEFAULT_SWIFT_VERSION)
|
147
|
+
native_app_target
|
148
|
+
end
|
112
149
|
end
|
113
|
-
.tap do
|
150
|
+
.compact.uniq.tap do
|
114
151
|
app_project.recreate_user_schemes do |scheme, target|
|
115
152
|
installation_result = installation_result_from_target(target)
|
116
153
|
next unless installation_result
|
@@ -120,9 +157,10 @@ module Pod
|
|
120
157
|
end
|
121
158
|
end
|
122
159
|
.each do |target|
|
123
|
-
Xcodeproj::XCScheme.share_scheme(app_project.path, target.name) if target
|
160
|
+
Xcodeproj::XCScheme.share_scheme(app_project.path.to_s, target.name) if target
|
124
161
|
end
|
125
162
|
app_project.save
|
163
|
+
app_project
|
126
164
|
end
|
127
165
|
|
128
166
|
def deployment_target(consumer)
|
@@ -138,8 +176,13 @@ module Pod
|
|
138
176
|
app_project.native_targets.each do |native_app_target|
|
139
177
|
remove_script_phase_from_target(native_app_target, 'Check Pods Manifest.lock')
|
140
178
|
|
141
|
-
|
142
|
-
|
179
|
+
spec_names = specs.map(&:name)
|
180
|
+
pod_targets = installer.pod_targets.select do |pt|
|
181
|
+
pt.platform.name == native_app_target.platform_name && spec_names.include?(pt.pod_name)
|
182
|
+
end
|
183
|
+
|
184
|
+
native_app_target.source_build_phase.clear
|
185
|
+
native_app_target.resources_build_phase.clear
|
143
186
|
|
144
187
|
if (app_host_source_dir = configuration.app_host_source_dir)
|
145
188
|
relative_app_host_source_dir = app_host_source_dir.relative_path_from(installer.sandbox.root)
|
@@ -172,10 +215,18 @@ module Pod
|
|
172
215
|
source_file_ref = group.new_file(file.basename)
|
173
216
|
native_app_target.add_file_references([source_file_ref])
|
174
217
|
end
|
175
|
-
elsif Pod::Generator::AppTargetHelper.method(:add_app_project_import).arity == -5 # CocoaPods >= 1.6
|
176
|
-
Pod::Generator::AppTargetHelper.add_app_project_import(app_project, native_app_target, pod_target, pod_target.platform.name, native_app_target.name)
|
177
218
|
else
|
178
|
-
|
219
|
+
platform_name = Platform.string_name(native_app_target.platform_name)
|
220
|
+
group = group_for_platform_name(app_project, platform_name)
|
221
|
+
main_file_ref = group.files.find { |f| f.display_name == 'main.m' }
|
222
|
+
if main_file_ref.nil?
|
223
|
+
source_file = create_main_source_file(app_project, pod_targets, native_app_target.name)
|
224
|
+
group = app_project[group.name] || app_project.new_group(group.name, group.name)
|
225
|
+
source_file_ref = group.new_file(source_file)
|
226
|
+
native_app_target.add_file_references([source_file_ref])
|
227
|
+
else
|
228
|
+
native_app_target.add_file_references([main_file_ref])
|
229
|
+
end
|
179
230
|
end
|
180
231
|
|
181
232
|
# Set `PRODUCT_BUNDLE_IDENTIFIER`
|
@@ -185,21 +236,25 @@ module Pod
|
|
185
236
|
|
186
237
|
case native_app_target.platform_name
|
187
238
|
when :ios
|
188
|
-
make_ios_app_launchable(
|
239
|
+
make_ios_app_launchable(app_project, native_app_target)
|
189
240
|
end
|
190
241
|
|
191
|
-
Pod::
|
242
|
+
swift_version = pod_targets.map { |pt| Pod::Version.new(pt.swift_version) }.max.to_s
|
243
|
+
|
244
|
+
Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, swift_version) unless swift_version.blank?
|
192
245
|
if installer.pod_targets.any? { |pt| pt.spec_consumers.any? { |c| c.frameworks.include?('XCTest') } }
|
193
246
|
Pod::Generator::AppTargetHelper.add_xctest_search_paths(native_app_target)
|
194
247
|
end
|
195
248
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
249
|
+
pod_targets.each do |pod_target|
|
250
|
+
result = installer.target_installation_results.pod_target_installation_results[pod_target.name]
|
251
|
+
share_scheme(result.native_target.project, pod_target.label)
|
252
|
+
pod_target.test_specs.each do |test_spec|
|
253
|
+
share_scheme(result.native_target.project, pod_target.test_target_label(test_spec))
|
254
|
+
end
|
255
|
+
pod_target.app_specs.each do |app_spec|
|
256
|
+
share_scheme(result.native_target.project, pod_target.app_target_label(app_spec))
|
200
257
|
end
|
201
|
-
elsif File.exist?(installer.pods_project.path + pod_target.label)
|
202
|
-
Xcodeproj::XCScheme.share_scheme(installer.pods_project.path, pod_target.label)
|
203
258
|
end
|
204
259
|
|
205
260
|
add_test_spec_schemes_to_app_scheme(installer, app_project)
|
@@ -223,25 +278,22 @@ module Pod
|
|
223
278
|
end
|
224
279
|
|
225
280
|
def add_test_spec_schemes_to_app_scheme(installer, app_project)
|
281
|
+
spec_root_names = Set.new(specs.map { |s| s.root.name })
|
282
|
+
|
226
283
|
test_native_targets =
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
.select { |installation_result| installation_result.target.pod_name == spec.root.name }
|
234
|
-
else
|
235
|
-
installer
|
236
|
-
.pod_targets
|
237
|
-
.select { |pod_target| pod_target.pod_name == spec.root.name }
|
238
|
-
end
|
284
|
+
installer
|
285
|
+
.target_installation_results
|
286
|
+
.pod_target_installation_results
|
287
|
+
.values
|
288
|
+
.flatten(1)
|
289
|
+
.select { |installation_result| spec_root_names.include?(installation_result.target.pod_name) }
|
239
290
|
.flat_map(&:test_native_targets)
|
240
291
|
.group_by(&:platform_name)
|
241
292
|
|
293
|
+
workspace_path = install_directory + (configuration.project_name_for_specs(specs) + '.xcworkspace')
|
242
294
|
Xcodeproj::Plist.write_to_path(
|
243
295
|
{ 'IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded' => false },
|
244
|
-
|
296
|
+
workspace_path.join('xcshareddata').tap(&:mkpath).join('WorkspaceSettings.xcsettings')
|
245
297
|
)
|
246
298
|
|
247
299
|
test_native_targets.each do |platform_name, test_targets|
|
@@ -257,7 +309,7 @@ module Pod
|
|
257
309
|
|
258
310
|
testable = Xcodeproj::XCScheme::TestAction::TestableReference.new(target)
|
259
311
|
testable.buildable_references.each do |buildable|
|
260
|
-
buildable.xml_element.attributes['ReferencedContainer'] =
|
312
|
+
buildable.xml_element.attributes['ReferencedContainer'] = "container:Pods/#{File.basename(target.project.path)}"
|
261
313
|
end
|
262
314
|
test_action.add_testable(testable)
|
263
315
|
end
|
@@ -266,9 +318,9 @@ module Pod
|
|
266
318
|
end
|
267
319
|
end
|
268
320
|
|
269
|
-
def make_ios_app_launchable(
|
321
|
+
def make_ios_app_launchable(app_project, native_app_target)
|
270
322
|
platform_name = Platform.string_name(native_app_target.platform_name)
|
271
|
-
generated_source_dir =
|
323
|
+
generated_source_dir = install_directory.join("App-#{platform_name}").tap(&:mkpath)
|
272
324
|
|
273
325
|
# Add `LaunchScreen.storyboard`
|
274
326
|
launch_storyboard = generated_source_dir.join('LaunchScreen.storyboard')
|
@@ -329,12 +381,17 @@ module Pod
|
|
329
381
|
Xcodeproj::Plist.write_to_path(info_plist_contents, info_plist_path)
|
330
382
|
|
331
383
|
native_app_target.build_configurations.each do |bc|
|
332
|
-
bc.build_settings['INFOPLIST_FILE'] = "${SRCROOT}/App
|
384
|
+
bc.build_settings['INFOPLIST_FILE'] = "${SRCROOT}/App-#{platform_name}/Info.plist"
|
333
385
|
end
|
334
386
|
|
335
|
-
group = app_project
|
336
|
-
group.new_file(info_plist_path)
|
337
|
-
|
387
|
+
group = group_for_platform_name(app_project, platform_name)
|
388
|
+
group.files.find { |f| f.display_name == 'Info.plist' } || group.new_file(info_plist_path)
|
389
|
+
launch_storyboard_file_ref = group.files.find { |f| f.display_name == 'LaunchScreen.storyboard' } || group.new_file(launch_storyboard)
|
390
|
+
native_app_target.resources_build_phase.add_file_reference(launch_storyboard_file_ref)
|
391
|
+
end
|
392
|
+
|
393
|
+
def group_for_platform_name(project, platform_name, should_create = true)
|
394
|
+
project.main_group.find_subpath("App-#{platform_name}", should_create)
|
338
395
|
end
|
339
396
|
|
340
397
|
def print_post_install_message
|
@@ -345,8 +402,36 @@ module Pod
|
|
345
402
|
Executable.execute_command 'open', [workspace_path]
|
346
403
|
end
|
347
404
|
else
|
348
|
-
UI.info "Open #{UI.path workspace_path} to work on
|
405
|
+
UI.info "Open #{UI.path workspace_path} to work on it!"
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
def share_scheme(project, scheme_name)
|
410
|
+
scheme = Xcodeproj::XCScheme.user_data_dir(project.path) + "#{scheme_name}.xcscheme"
|
411
|
+
return unless File.exist?(scheme)
|
412
|
+
Xcodeproj::XCScheme.share_scheme(project.path, scheme_name)
|
413
|
+
end
|
414
|
+
|
415
|
+
def create_main_source_file(project, pod_targets, name)
|
416
|
+
source_file = project.path.dirname.+("#{name}/main.m")
|
417
|
+
source_file.parent.mkpath
|
418
|
+
|
419
|
+
import_statements = pod_targets.map do |pod_target|
|
420
|
+
if pod_target.should_build? && pod_target.defines_module?
|
421
|
+
"@import #{pod_target.product_module_name};"
|
422
|
+
else
|
423
|
+
header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
|
424
|
+
"#import <#{header_name}>" if pod_target.sandbox.public_headers.root.+(header_name).file?
|
425
|
+
end
|
426
|
+
end.compact
|
427
|
+
|
428
|
+
source_file.open('w') do |f|
|
429
|
+
f << import_statements.join("\n")
|
430
|
+
f << "\n" unless import_statements.empty?
|
431
|
+
f << "int main() { return 0; }\n"
|
349
432
|
end
|
433
|
+
|
434
|
+
source_file
|
350
435
|
end
|
351
436
|
end
|
352
437
|
end
|
@@ -14,26 +14,27 @@ module Pod
|
|
14
14
|
@configuration = configuration
|
15
15
|
end
|
16
16
|
|
17
|
-
# @return [Hash<Specification
|
18
|
-
# a hash of specifications to generated podfiles
|
17
|
+
# @return [Hash<Array<Specification>, Podfile>] the podfiles keyed by the specs that are part of each.
|
19
18
|
#
|
20
|
-
def
|
19
|
+
def podfiles_by_specs
|
20
|
+
return { configuration.podspecs => podfile_for_specs(configuration.podspecs) } if configuration.single_workspace?
|
21
21
|
Hash[configuration.podspecs.map do |spec|
|
22
|
-
[spec,
|
22
|
+
[[spec], podfile_for_specs([spec])]
|
23
23
|
end]
|
24
24
|
end
|
25
25
|
|
26
26
|
# @return [Podfile] a podfile suitable for installing the given spec
|
27
27
|
#
|
28
|
-
# @param [Specification]
|
28
|
+
# @param [Array<Specification>] specs
|
29
29
|
#
|
30
|
-
def
|
30
|
+
def podfile_for_specs(specs)
|
31
31
|
generator = self
|
32
|
-
dir = configuration.
|
32
|
+
dir = configuration.gen_dir_for_specs(specs)
|
33
|
+
project_name = configuration.project_name_for_specs(specs)
|
33
34
|
|
34
35
|
Pod::Podfile.new do
|
35
|
-
project "#{
|
36
|
-
workspace "#{
|
36
|
+
project "#{project_name}.xcodeproj"
|
37
|
+
workspace "#{project_name}.xcworkspace"
|
37
38
|
|
38
39
|
plugin 'cocoapods-generate'
|
39
40
|
|
@@ -43,7 +44,7 @@ module Pod
|
|
43
44
|
plugin(*[name, options].compact)
|
44
45
|
end
|
45
46
|
|
46
|
-
use_frameworks!(generator.
|
47
|
+
use_frameworks!(generator.use_frameworks_value)
|
47
48
|
|
48
49
|
if (supported_swift_versions = generator.supported_swift_versions)
|
49
50
|
supports_swift_versions(supported_swift_versions)
|
@@ -56,24 +57,32 @@ module Pod
|
|
56
57
|
|
57
58
|
self.defined_in_file = dir.join('CocoaPods.podfile.yaml')
|
58
59
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
test_specs_by_spec = Hash[specs.map do |spec|
|
61
|
+
[spec, spec.recursive_subspecs.select(&:test_specification?)]
|
62
|
+
end]
|
63
|
+
app_specs_by_spec = Hash[specs.map do |spec|
|
64
|
+
app_specs = if spec.respond_to?(:app_specification?)
|
65
|
+
spec.recursive_subspecs.select(&:app_specification?)
|
66
|
+
else
|
67
|
+
[]
|
68
|
+
end
|
69
|
+
[spec, app_specs]
|
70
|
+
end]
|
65
71
|
|
66
72
|
# Stick all of the transitive dependencies in an abstract target.
|
67
73
|
# This allows us to force CocoaPods to use the versions / sources / external sources
|
68
74
|
# that we want.
|
69
|
-
# By using an abstract target,
|
70
75
|
abstract_target 'Transitive Dependencies' do
|
71
|
-
pods_for_transitive_dependencies =
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
+
pods_for_transitive_dependencies = specs.flat_map do |spec|
|
77
|
+
[spec.name]
|
78
|
+
.concat(test_specs_by_spec.keys.map(&:name))
|
79
|
+
.concat(test_specs_by_spec.values.flatten.flat_map { |ts| ts.dependencies.flat_map(&:name) })
|
80
|
+
.concat(app_specs_by_spec.keys.map(&:name))
|
81
|
+
.concat(app_specs_by_spec.values.flatten.flat_map { |as| as.dependencies.flat_map(&:name) })
|
82
|
+
end
|
83
|
+
pods_for_transitive_dependencies.uniq!
|
76
84
|
|
85
|
+
spec_names = specs.map { |s| s.root.name }.to_set
|
77
86
|
dependencies = generator
|
78
87
|
.transitive_dependencies_by_pod
|
79
88
|
.values_at(*pods_for_transitive_dependencies)
|
@@ -81,7 +90,7 @@ module Pod
|
|
81
90
|
.flatten(1)
|
82
91
|
.uniq
|
83
92
|
.sort_by(&:name)
|
84
|
-
.reject { |d| d.root_name
|
93
|
+
.reject { |d| spec_names.include?(d.root_name) }
|
85
94
|
|
86
95
|
dependencies.each do |dependency|
|
87
96
|
pod_args = generator.pod_args_for_dependency(self, dependency)
|
@@ -89,9 +98,8 @@ module Pod
|
|
89
98
|
end
|
90
99
|
end
|
91
100
|
|
92
|
-
# Add platform-specific concrete targets that inherit the
|
93
|
-
|
94
|
-
spec_platform_names = spec.available_platforms.map(&:string_name).flatten.each.reject do |platform_name|
|
101
|
+
# Add platform-specific concrete targets that inherit the `pod` declaration for the local pod.
|
102
|
+
spec_platform_names = specs.flat_map { |s| s.available_platforms.map(&:string_name) }.uniq.each.reject do |platform_name|
|
95
103
|
!generator.configuration.platforms.nil? && !generator.configuration.platforms.include?(platform_name.downcase)
|
96
104
|
end
|
97
105
|
|
@@ -116,50 +124,59 @@ module Pod
|
|
116
124
|
inhibit_all_warnings! if generator.inhibit_all_warnings?
|
117
125
|
use_modular_headers! if generator.use_modular_headers?
|
118
126
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
{ testspecs: test_specs, appspecs: app_specs }.each do |key, specs|
|
124
|
-
pod_options[key] = specs.map { |s| s.name.sub(%r{^#{Regexp.escape spec.root.name}/}, '') }.sort unless specs.empty?
|
125
|
-
end
|
127
|
+
specs.each do |spec|
|
128
|
+
# This is the pod declaration for the local pod,
|
129
|
+
# it will be inherited by the concrete target definitions below
|
130
|
+
pod_options = generator.dependency_compilation_kwargs(spec.name)
|
126
131
|
|
127
|
-
|
132
|
+
path = spec.defined_in_file.relative_path_from(dir).to_s
|
133
|
+
pod_options[:path] = path
|
134
|
+
{ testspecs: test_specs_by_spec[spec], appspecs: app_specs_by_spec[spec] }.each do |key, subspecs|
|
135
|
+
pod_options[key] = subspecs.map { |s| s.name.sub(%r{^#{Regexp.escape spec.root.name}/}, '') }.sort unless subspecs.blank?
|
136
|
+
end
|
137
|
+
pod spec.name, **pod_options
|
138
|
+
end
|
128
139
|
|
129
140
|
# Implement local-sources option to set up dependencies to podspecs in the local filesystem.
|
130
141
|
next if generator.configuration.local_sources.empty?
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
142
|
+
specs.each do |spec|
|
143
|
+
generator.transitive_local_dependencies(spec, generator.configuration.local_sources).sort_by(&:first).each do |dependency, podspec_file|
|
144
|
+
pod_options = generator.dependency_compilation_kwargs(dependency.name)
|
145
|
+
pod_options[:path] = if podspec_file[0] == '/' # absolute path
|
146
|
+
podspec_file
|
147
|
+
else
|
148
|
+
'../../' + podspec_file
|
149
|
+
end
|
150
|
+
pod dependency.name, **pod_options
|
151
|
+
end
|
139
152
|
end
|
140
153
|
end
|
141
154
|
end
|
142
155
|
|
143
|
-
def transitive_local_dependencies(spec, paths)
|
144
|
-
|
145
|
-
|
146
|
-
|
156
|
+
def transitive_local_dependencies(spec, paths, found_podspecs: {}, include_non_library_subspecs: true)
|
157
|
+
if include_non_library_subspecs
|
158
|
+
non_library_specs = spec.recursive_subspecs.select do |ss|
|
159
|
+
ss.test_specification? || (ss.respond_to?(:app_specification?) && ss.app_specification?)
|
160
|
+
end
|
161
|
+
non_library_specs.each do |subspec|
|
162
|
+
transitive_local_dependencies(subspec, paths, found_podspecs: found_podspecs, include_non_library_subspecs: false)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
spec.dependencies.each do |dependency|
|
166
|
+
next if found_podspecs.key?(dependency)
|
147
167
|
found_podspec_file = nil
|
148
168
|
name = dependency.name.split('/')[0]
|
149
169
|
paths.each do |path|
|
150
|
-
podspec_file = path
|
170
|
+
podspec_file = File.join(path, name + '.podspec')
|
151
171
|
next unless File.file?(podspec_file)
|
152
172
|
found_podspec_file = podspec_file
|
153
173
|
break
|
154
174
|
end
|
155
175
|
next unless found_podspec_file
|
156
|
-
|
157
|
-
|
158
|
-
dep_spec.dependencies.each do |d_dep|
|
159
|
-
dependencies << d_dep unless dependencies.include? d_dep
|
160
|
-
end
|
176
|
+
found_podspecs[dependency] = found_podspec_file.sub(%r{\A\./}, '')
|
177
|
+
transitive_local_dependencies(Pod::Specification.from_file(found_podspec_file), paths, found_podspecs: found_podspecs)
|
161
178
|
end
|
162
|
-
|
179
|
+
found_podspecs
|
163
180
|
end
|
164
181
|
|
165
182
|
# @return [Boolean]
|
@@ -189,6 +206,27 @@ module Pod
|
|
189
206
|
end
|
190
207
|
end
|
191
208
|
|
209
|
+
# @return [Boolean, Hash]
|
210
|
+
# the value to use for `use_frameworks!` DSL directive
|
211
|
+
#
|
212
|
+
def use_frameworks_value
|
213
|
+
return configuration.use_frameworks? unless configuration.use_podfile?
|
214
|
+
use_framework_values = target_definition_list.map do |target_definition|
|
215
|
+
if target_definition.respond_to?(:build_type) # CocoaPods >= 1.9
|
216
|
+
build_type = target_definition.build_type
|
217
|
+
if build_type.static_library?
|
218
|
+
false
|
219
|
+
else
|
220
|
+
{ linkage: build_type == BuildType.dynamic_framework ? :dynamic : :static }
|
221
|
+
end
|
222
|
+
else
|
223
|
+
target_definition.uses_frameworks?
|
224
|
+
end
|
225
|
+
end.uniq
|
226
|
+
raise Informative, 'Multiple use_frameworks! values detected in user Podfile.' unless use_framework_values.count == 1
|
227
|
+
use_framework_values.first
|
228
|
+
end
|
229
|
+
|
192
230
|
# @return [Hash]
|
193
231
|
# a hash with "compilation"-related dependency options for the `pod` DSL method
|
194
232
|
#
|
@@ -299,7 +337,7 @@ module Pod
|
|
299
337
|
def installation_options
|
300
338
|
installation_options = {
|
301
339
|
deterministic_uuids: configuration.deterministic_uuids?,
|
302
|
-
share_schemes_for_development_pods: configuration.share_schemes_for_development_pods
|
340
|
+
share_schemes_for_development_pods: configuration.share_schemes_for_development_pods,
|
303
341
|
warn_for_multiple_pod_sources: configuration.warn_for_multiple_pod_sources?
|
304
342
|
}
|
305
343
|
|
@@ -311,6 +349,10 @@ module Pod
|
|
311
349
|
installation_options[:incremental_installation] = configuration.incremental_installation?
|
312
350
|
end
|
313
351
|
|
352
|
+
if Pod::Installer::InstallationOptions.all_options.include?('disable_input_output_paths')
|
353
|
+
installation_options[:disable_input_output_paths] = configuration.disable_input_output_paths
|
354
|
+
end
|
355
|
+
|
314
356
|
installation_options
|
315
357
|
end
|
316
358
|
|
data/lib/cocoapods_plugin.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-generate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Giddins
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocoapods-disable-podfile-validations
|
@@ -86,7 +86,7 @@ homepage: https://github.com/square/cocoapods-generate
|
|
86
86
|
licenses:
|
87
87
|
- MIT
|
88
88
|
metadata: {}
|
89
|
-
post_install_message:
|
89
|
+
post_install_message:
|
90
90
|
rdoc_options: []
|
91
91
|
require_paths:
|
92
92
|
- lib
|
@@ -101,8 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
|
-
rubygems_version: 3.
|
105
|
-
signing_key:
|
104
|
+
rubygems_version: 3.1.3
|
105
|
+
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: Generates Xcode workspaces from a podspec.
|
108
108
|
test_files: []
|