cocoapods-generate 2.0.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|