cocoapods-generate 2.0.0 → 2.2.1
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 +2 -2
- data/lib/cocoapods/generate/configuration.rb +26 -15
- data/lib/cocoapods/generate/installer.rb +109 -58
- data/lib/cocoapods/generate/podfile_generator.rb +58 -42
- data/lib/cocoapods_plugin.rb +1 -1
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee3258545cab5bd0ed207d266668ab48b3dbe581d0a77591e5eb357b954ddc47
|
4
|
+
data.tar.gz: 16aea52165bfa4fb4c90fd9e031821ccde0e65e1468817e00163e6c26050fbe4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7f5c160b8deba03d38b31ab82100a5c5f55494970a0edbef3967a73392323ad60b00efef92a3d05f4477411bc9a9dd99c641795cb6195cc3f1642160ef7d755
|
7
|
+
data.tar.gz: b117590d517859c8207428b4328ad5785f2e4e53c5bd1802e53eee35e8700af01c547c7f53d174a2a9733da82c73922a8ac2f1f32d1a582c1ba4b78519dfc049
|
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
|
-
2.
|
1
|
+
2.2.1
|
@@ -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)
|
@@ -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
|
@@ -318,14 +326,14 @@ module Pod
|
|
318
326
|
|
319
327
|
# @return [String] The project name to use for generating this workspace.
|
320
328
|
#
|
321
|
-
# @param [Specification]
|
322
|
-
# the
|
329
|
+
# @param [Array<Specification>] specs
|
330
|
+
# the specifications to generate project name for.
|
323
331
|
#
|
324
|
-
def
|
325
|
-
project_name =
|
332
|
+
def project_name_for_specs(specs)
|
333
|
+
project_name = specs.count == 1 ? +specs.first.name.dup : +'Workspace'
|
326
334
|
# When using multiple Xcode project the project name will collide with the actual .xcodeproj meant for the pod
|
327
335
|
# that we are generating the workspace for.
|
328
|
-
project_name << 'Sample' if generate_multiple_pod_projects?
|
336
|
+
project_name << 'Sample' if generate_multiple_pod_projects? && specs.count == 1
|
329
337
|
project_name
|
330
338
|
end
|
331
339
|
|
@@ -335,7 +343,10 @@ module Pod
|
|
335
343
|
# @param [Array<Pathname,URI>] paths
|
336
344
|
# the paths to search for podspecs
|
337
345
|
#
|
338
|
-
|
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)
|
339
350
|
paths = [Pathname('.')] if paths.empty?
|
340
351
|
paths.flat_map do |path|
|
341
352
|
if path.is_a?(URI)
|
@@ -351,7 +362,7 @@ module Pod
|
|
351
362
|
$ERROR_INFO
|
352
363
|
end
|
353
364
|
elsif path.directory?
|
354
|
-
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?('..') }
|
355
366
|
next StandardError.new "no specs found in #{UI.path path}" if glob.empty?
|
356
367
|
glob.map { |f| Pod::Specification.from_file(f) }.sort_by(&:name)
|
357
368
|
else
|
@@ -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
|
|
@@ -89,11 +103,15 @@ module Pod
|
|
89
103
|
end
|
90
104
|
|
91
105
|
def open_app_project(recreate: false)
|
92
|
-
app_project_path = install_directory.join("#{configuration.
|
106
|
+
app_project_path = install_directory.join("#{configuration.project_name_for_specs(specs)}.xcodeproj")
|
93
107
|
if !recreate && app_project_path.exist?
|
94
108
|
Xcodeproj::Project.open(app_project_path)
|
95
109
|
else
|
96
|
-
|
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)
|
97
115
|
end
|
98
116
|
end
|
99
117
|
|
@@ -104,27 +122,32 @@ module Pod
|
|
104
122
|
def create_app_project
|
105
123
|
app_project = open_app_project(recreate: !configuration.incremental_installation?)
|
106
124
|
|
107
|
-
|
108
|
-
|
109
|
-
|
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]
|
110
131
|
|
111
|
-
if
|
112
|
-
Pod::Command::Gen.help! Pod::StandardError.new "No available platforms
|
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}"
|
113
134
|
end
|
114
135
|
|
115
|
-
|
116
|
-
.
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
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
|
126
149
|
end
|
127
|
-
.compact.tap do
|
150
|
+
.compact.uniq.tap do
|
128
151
|
app_project.recreate_user_schemes do |scheme, target|
|
129
152
|
installation_result = installation_result_from_target(target)
|
130
153
|
next unless installation_result
|
@@ -134,9 +157,10 @@ module Pod
|
|
134
157
|
end
|
135
158
|
end
|
136
159
|
.each do |target|
|
137
|
-
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
|
138
161
|
end
|
139
162
|
app_project.save
|
163
|
+
app_project
|
140
164
|
end
|
141
165
|
|
142
166
|
def deployment_target(consumer)
|
@@ -152,8 +176,10 @@ module Pod
|
|
152
176
|
app_project.native_targets.each do |native_app_target|
|
153
177
|
remove_script_phase_from_target(native_app_target, 'Check Pods Manifest.lock')
|
154
178
|
|
155
|
-
|
156
|
-
|
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
|
157
183
|
|
158
184
|
native_app_target.source_build_phase.clear
|
159
185
|
native_app_target.resources_build_phase.clear
|
@@ -189,22 +215,18 @@ module Pod
|
|
189
215
|
source_file_ref = group.new_file(file.basename)
|
190
216
|
native_app_target.add_file_references([source_file_ref])
|
191
217
|
end
|
192
|
-
|
193
|
-
# If we are doing incremental installation then the file might already be there.
|
218
|
+
else
|
194
219
|
platform_name = Platform.string_name(native_app_target.platform_name)
|
195
220
|
group = group_for_platform_name(app_project, platform_name)
|
196
221
|
main_file_ref = group.files.find { |f| f.display_name == 'main.m' }
|
197
222
|
if main_file_ref.nil?
|
198
|
-
|
199
|
-
|
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])
|
200
227
|
else
|
201
228
|
native_app_target.add_file_references([main_file_ref])
|
202
229
|
end
|
203
|
-
else
|
204
|
-
Pod::Generator::AppTargetHelper.add_app_project_import(app_project, native_app_target, pod_target,
|
205
|
-
pod_target.platform.name,
|
206
|
-
pod_target.requires_frameworks?,
|
207
|
-
native_app_target.name)
|
208
230
|
end
|
209
231
|
|
210
232
|
# Set `PRODUCT_BUNDLE_IDENTIFIER`
|
@@ -217,18 +239,23 @@ module Pod
|
|
217
239
|
make_ios_app_launchable(app_project, native_app_target)
|
218
240
|
end
|
219
241
|
|
220
|
-
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?
|
221
245
|
if installer.pod_targets.any? { |pt| pt.spec_consumers.any? { |c| c.frameworks.include?('XCTest') } }
|
222
246
|
Pod::Generator::AppTargetHelper.add_xctest_search_paths(native_app_target)
|
223
247
|
end
|
224
248
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
249
|
+
pod_targets.each do |pod_target|
|
250
|
+
result = installer.target_installation_results.pod_target_installation_results[pod_target.name]
|
251
|
+
next unless result
|
252
|
+
share_scheme(result.native_target.project, pod_target.label)
|
253
|
+
pod_target.test_specs.each do |test_spec|
|
254
|
+
share_scheme(result.native_target.project, pod_target.test_target_label(test_spec))
|
255
|
+
end
|
256
|
+
pod_target.app_specs.each do |app_spec|
|
257
|
+
share_scheme(result.native_target.project, pod_target.app_target_label(app_spec))
|
229
258
|
end
|
230
|
-
elsif File.exist?(installer.pods_project.path + pod_target.label)
|
231
|
-
Xcodeproj::XCScheme.share_scheme(installer.pods_project.path, pod_target.label)
|
232
259
|
end
|
233
260
|
|
234
261
|
add_test_spec_schemes_to_app_scheme(installer, app_project)
|
@@ -252,23 +279,19 @@ module Pod
|
|
252
279
|
end
|
253
280
|
|
254
281
|
def add_test_spec_schemes_to_app_scheme(installer, app_project)
|
282
|
+
spec_root_names = Set.new(specs.map { |s| s.root.name })
|
283
|
+
|
255
284
|
test_native_targets =
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
.select { |installation_result| installation_result.target.pod_name == spec.root.name }
|
263
|
-
else
|
264
|
-
installer
|
265
|
-
.pod_targets
|
266
|
-
.select { |pod_target| pod_target.pod_name == spec.root.name }
|
267
|
-
end
|
285
|
+
installer
|
286
|
+
.target_installation_results
|
287
|
+
.pod_target_installation_results
|
288
|
+
.values
|
289
|
+
.flatten(1)
|
290
|
+
.select { |installation_result| spec_root_names.include?(installation_result.target.pod_name) }
|
268
291
|
.flat_map(&:test_native_targets)
|
269
292
|
.group_by(&:platform_name)
|
270
293
|
|
271
|
-
workspace_path = install_directory +
|
294
|
+
workspace_path = install_directory + (configuration.project_name_for_specs(specs) + '.xcworkspace')
|
272
295
|
Xcodeproj::Plist.write_to_path(
|
273
296
|
{ 'IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded' => false },
|
274
297
|
workspace_path.join('xcshareddata').tap(&:mkpath).join('WorkspaceSettings.xcsettings')
|
@@ -287,7 +310,7 @@ module Pod
|
|
287
310
|
|
288
311
|
testable = Xcodeproj::XCScheme::TestAction::TestableReference.new(target)
|
289
312
|
testable.buildable_references.each do |buildable|
|
290
|
-
buildable.xml_element.attributes['ReferencedContainer'] =
|
313
|
+
buildable.xml_element.attributes['ReferencedContainer'] = "container:Pods/#{File.basename(target.project.path)}"
|
291
314
|
end
|
292
315
|
test_action.add_testable(testable)
|
293
316
|
end
|
@@ -380,9 +403,37 @@ module Pod
|
|
380
403
|
Executable.execute_command 'open', [workspace_path]
|
381
404
|
end
|
382
405
|
else
|
383
|
-
UI.info "Open #{UI.path workspace_path} to work on
|
406
|
+
UI.info "Open #{UI.path workspace_path} to work on it!"
|
384
407
|
end
|
385
408
|
end
|
409
|
+
|
410
|
+
def share_scheme(project, scheme_name)
|
411
|
+
scheme = Xcodeproj::XCScheme.user_data_dir(project.path) + "#{scheme_name}.xcscheme"
|
412
|
+
return unless File.exist?(scheme)
|
413
|
+
Xcodeproj::XCScheme.share_scheme(project.path, scheme_name)
|
414
|
+
end
|
415
|
+
|
416
|
+
def create_main_source_file(project, pod_targets, name)
|
417
|
+
source_file = project.path.dirname.+("#{name}/main.m")
|
418
|
+
source_file.parent.mkpath
|
419
|
+
|
420
|
+
import_statements = pod_targets.map do |pod_target|
|
421
|
+
if pod_target.should_build? && pod_target.defines_module?
|
422
|
+
"@import #{pod_target.product_module_name};"
|
423
|
+
else
|
424
|
+
header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
|
425
|
+
"#import <#{header_name}>" if pod_target.sandbox.public_headers.root.+(header_name).file?
|
426
|
+
end
|
427
|
+
end.compact
|
428
|
+
|
429
|
+
source_file.open('w') do |f|
|
430
|
+
f << import_statements.join("\n")
|
431
|
+
f << "\n" unless import_statements.empty?
|
432
|
+
f << "int main() { return 0; }\n"
|
433
|
+
end
|
434
|
+
|
435
|
+
source_file
|
436
|
+
end
|
386
437
|
end
|
387
438
|
end
|
388
439
|
end
|
@@ -14,27 +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.
|
33
|
-
project_name = configuration.
|
32
|
+
dir = configuration.gen_dir_for_specs(specs)
|
33
|
+
project_name = configuration.project_name_for_specs(specs)
|
34
34
|
|
35
35
|
Pod::Podfile.new do
|
36
36
|
project "#{project_name}.xcodeproj"
|
37
|
-
workspace "#{
|
37
|
+
workspace "#{project_name}.xcworkspace"
|
38
38
|
|
39
39
|
plugin 'cocoapods-generate'
|
40
40
|
|
@@ -57,24 +57,32 @@ module Pod
|
|
57
57
|
|
58
58
|
self.defined_in_file = dir.join('CocoaPods.podfile.yaml')
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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]
|
66
71
|
|
67
72
|
# Stick all of the transitive dependencies in an abstract target.
|
68
73
|
# This allows us to force CocoaPods to use the versions / sources / external sources
|
69
74
|
# that we want.
|
70
|
-
# By using an abstract target,
|
71
75
|
abstract_target 'Transitive Dependencies' do
|
72
|
-
pods_for_transitive_dependencies =
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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!
|
77
84
|
|
85
|
+
spec_names = specs.map { |s| s.root.name }.to_set
|
78
86
|
dependencies = generator
|
79
87
|
.transitive_dependencies_by_pod
|
80
88
|
.values_at(*pods_for_transitive_dependencies)
|
@@ -82,7 +90,7 @@ module Pod
|
|
82
90
|
.flatten(1)
|
83
91
|
.uniq
|
84
92
|
.sort_by(&:name)
|
85
|
-
.reject { |d| d.root_name
|
93
|
+
.reject { |d| spec_names.include?(d.root_name) }
|
86
94
|
|
87
95
|
dependencies.each do |dependency|
|
88
96
|
pod_args = generator.pod_args_for_dependency(self, dependency)
|
@@ -90,9 +98,8 @@ module Pod
|
|
90
98
|
end
|
91
99
|
end
|
92
100
|
|
93
|
-
# Add platform-specific concrete targets that inherit the
|
94
|
-
|
95
|
-
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|
|
96
103
|
!generator.configuration.platforms.nil? && !generator.configuration.platforms.include?(platform_name.downcase)
|
97
104
|
end
|
98
105
|
|
@@ -117,26 +124,31 @@ module Pod
|
|
117
124
|
inhibit_all_warnings! if generator.inhibit_all_warnings?
|
118
125
|
use_modular_headers! if generator.use_modular_headers?
|
119
126
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
{ testspecs: test_specs, appspecs: app_specs }.each do |key, specs|
|
125
|
-
pod_options[key] = specs.map { |s| s.name.sub(%r{^#{Regexp.escape spec.root.name}/}, '') }.sort unless specs.empty?
|
126
|
-
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)
|
127
131
|
|
128
|
-
|
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
|
129
139
|
|
130
140
|
# Implement local-sources option to set up dependencies to podspecs in the local filesystem.
|
131
141
|
next if generator.configuration.local_sources.empty?
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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
|
140
152
|
end
|
141
153
|
end
|
142
154
|
end
|
@@ -325,7 +337,7 @@ module Pod
|
|
325
337
|
def installation_options
|
326
338
|
installation_options = {
|
327
339
|
deterministic_uuids: configuration.deterministic_uuids?,
|
328
|
-
share_schemes_for_development_pods: configuration.share_schemes_for_development_pods
|
340
|
+
share_schemes_for_development_pods: configuration.share_schemes_for_development_pods,
|
329
341
|
warn_for_multiple_pod_sources: configuration.warn_for_multiple_pod_sources?
|
330
342
|
}
|
331
343
|
|
@@ -337,6 +349,10 @@ module Pod
|
|
337
349
|
installation_options[:incremental_installation] = configuration.incremental_installation?
|
338
350
|
end
|
339
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
|
+
|
340
356
|
installation_options
|
341
357
|
end
|
342
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: 2.
|
4
|
+
version: 2.2.1
|
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-08 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,9 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
|
-
|
105
|
-
|
106
|
-
signing_key:
|
104
|
+
rubygems_version: 3.0.3
|
105
|
+
signing_key:
|
107
106
|
specification_version: 4
|
108
107
|
summary: Generates Xcode workspaces from a podspec.
|
109
108
|
test_files: []
|