cocoapods-generate 1.5.0 → 2.1.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 +9 -0
- data/VERSION +1 -1
- data/lib/cocoapods/command/gen.rb +6 -4
- data/lib/cocoapods/generate/configuration.rb +39 -11
- data/lib/cocoapods/generate/installer.rb +136 -63
- data/lib/cocoapods/generate/podfile_generator.rb +101 -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: 6a8a9087ec80789ce819fb41abc24a050e4519320fd2423f6ee2467bc59d7bb1
|
4
|
+
data.tar.gz: e461543cdb4cea9b93bca67fe27fe9cac78488ba582a8f045cb010e7bd6b29a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00d45b22642ad325b63ed94dbdd853c319ea591950129a5885b178f4fa64bc1fd3bdba7fa6102ac1ad9a5970a288563095bbd1dfac153d913dd889531e7cc81c
|
7
|
+
data.tar.gz: b0fb113e1514f18d62bcfce34242d6ae0c91279f97a185977433cee5f7081c853f2d2221460532f4f435cb17523e4570a0f0eb79cd4031ab77881590aeb1bb4f
|
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
|
@@ -79,12 +80,18 @@ Options:
|
|
79
80
|
--local-sources=SOURCE1,SOURCE2 Paths from which to find local podspecs for
|
80
81
|
transitive dependencies. Multiple
|
81
82
|
local-sources must be comma-delimited.
|
83
|
+
--platforms=ios,macos Limit to specific platforms. Default is all
|
84
|
+
platforms supported by the podspec.
|
85
|
+
Multiple platforms must be comma-delimited.
|
82
86
|
--repo-update Force running `pod repo update` before
|
83
87
|
install
|
84
88
|
--use-default-plugins Whether installation should activate
|
85
89
|
default plugins
|
86
90
|
--deterministic-uuids Whether installation should use
|
87
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)
|
88
95
|
--share-schemes-for-development-pods Whether installation should share schemes
|
89
96
|
for development pods
|
90
97
|
--warn-for-multiple-pod-sources Whether installation should warn when a pod
|
@@ -94,6 +101,8 @@ Options:
|
|
94
101
|
modules, as if `use_modular_headers!` were
|
95
102
|
specified. Will error if both this option
|
96
103
|
and a podfile are specified
|
104
|
+
--single-workspace Whether to produce a single workspace for
|
105
|
+
all podspecs specified.
|
97
106
|
```
|
98
107
|
<!-- end cli usage -->
|
99
108
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
2.1.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)
|
@@ -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) }
|
@@ -169,7 +169,7 @@ module Pod
|
|
169
169
|
->(paths) { ('paths do not exist' unless paths.all? { |p| p.is_a?(URI) || p.exist? }) },
|
170
170
|
->(paths) { paths && paths.map { |path| path.to_s =~ %r{https?://} ? URI(path) : Pathname(path).expand_path } }
|
171
171
|
option :podspecs, ArrayOf.new(Pod::Specification),
|
172
|
-
'self.class.podspecs_from_paths(podspec_paths)',
|
172
|
+
'self.class.podspecs_from_paths(podspec_paths, gen_directory)',
|
173
173
|
nil,
|
174
174
|
nil,
|
175
175
|
->(specs) { 'no podspecs found' if specs.empty? },
|
@@ -188,12 +188,23 @@ module Pod
|
|
188
188
|
'SOURCE1,SOURCE2',
|
189
189
|
->(_) { nil },
|
190
190
|
->(local_sources) { Array(local_sources).flat_map { |s| s.split(',') } }
|
191
|
+
option :platforms, ArrayOf.new(String),
|
192
|
+
nil,
|
193
|
+
'Limit to specific platforms. Default is all platforms supported by the podspec. Multiple platforms must be comma-delimited.',
|
194
|
+
'ios,macos',
|
195
|
+
lambda { |platforms|
|
196
|
+
valid_platforms = Platform.all.map { |p| p.string_name.downcase }
|
197
|
+
valid_platforms unless (platforms - valid_platforms).empty?
|
198
|
+
}, # validates platforms is a subset of Platform.all
|
199
|
+
->(platforms) { Array(platforms).flat_map { |s| s.split(',') } }
|
191
200
|
option :repo_update, BOOLEAN, 'false', 'Force running `pod repo update` before install', nil, nil, coerce_to_bool
|
192
201
|
option :use_default_plugins, BOOLEAN, 'false', 'Whether installation should activate default plugins', nil, nil, coerce_to_bool
|
193
|
-
option :deterministic_uuids, BOOLEAN, 'false', 'Whether installation should use deterministic UUIDs for pods projects', nil, nil, coerce_to_bool
|
194
|
-
option :
|
195
|
-
option :
|
202
|
+
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
|
203
|
+
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
|
204
|
+
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
|
205
|
+
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
|
196
206
|
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
|
207
|
+
option :single_workspace, BOOLEAN, 'false', 'Whether to produce a single workspace for all podspecs specified.', nil, nil, coerce_to_bool
|
197
208
|
|
198
209
|
options.freeze
|
199
210
|
options.each do |o|
|
@@ -293,12 +304,13 @@ module Pod
|
|
293
304
|
end << ' }'
|
294
305
|
end
|
295
306
|
|
296
|
-
# @return [Pathname] the directory for installation of the generated workspace
|
307
|
+
# @return [Pathname] the directory for installation of the generated workspace.
|
297
308
|
#
|
298
|
-
# @param [
|
309
|
+
# @param [Array<Specification>] specs The specs to get a directory name for.
|
299
310
|
#
|
300
|
-
def
|
301
|
-
|
311
|
+
def gen_dir_for_specs(specs)
|
312
|
+
basename = specs.count == 1 ? specs.first.name : 'Workspace'
|
313
|
+
gen_directory.join(basename)
|
302
314
|
end
|
303
315
|
|
304
316
|
# @return [Boolean] whether gen should install with dynamic frameworks
|
@@ -307,13 +319,29 @@ module Pod
|
|
307
319
|
!use_libraries?
|
308
320
|
end
|
309
321
|
|
322
|
+
# @return [String] The project name to use for generating this workspace.
|
323
|
+
#
|
324
|
+
# @param [Array<Specification>] specs
|
325
|
+
# the specifications to generate project name for.
|
326
|
+
#
|
327
|
+
def project_name_for_specs(specs)
|
328
|
+
project_name = specs.count == 1 ? +specs.first.name.dup : +'Workspace'
|
329
|
+
# When using multiple Xcode project the project name will collide with the actual .xcodeproj meant for the pod
|
330
|
+
# that we are generating the workspace for.
|
331
|
+
project_name << 'Sample' if generate_multiple_pod_projects? && specs.count == 1
|
332
|
+
project_name
|
333
|
+
end
|
334
|
+
|
310
335
|
# @return [Array<Specification>] the podspecs found at the given paths.
|
311
336
|
# This method will download specs from URLs and traverse a directory's children.
|
312
337
|
#
|
313
338
|
# @param [Array<Pathname,URI>] paths
|
314
339
|
# the paths to search for podspecs
|
315
340
|
#
|
316
|
-
|
341
|
+
# @param [Pathname] gen_directory
|
342
|
+
# the directory that the gen installation would occur into.
|
343
|
+
#
|
344
|
+
def self.podspecs_from_paths(paths, gen_directory)
|
317
345
|
paths = [Pathname('.')] if paths.empty?
|
318
346
|
paths.flat_map do |path|
|
319
347
|
if path.is_a?(URI)
|
@@ -329,9 +357,9 @@ module Pod
|
|
329
357
|
$ERROR_INFO
|
330
358
|
end
|
331
359
|
elsif path.directory?
|
332
|
-
glob = Pathname.glob(path + '
|
360
|
+
glob = Pathname.glob(path.expand_path + '**/*.podspec{.json,}').select { |f| f.relative_path_from(gen_directory).to_s.start_with?('..') }
|
333
361
|
next StandardError.new "no specs found in #{UI.path path}" if glob.empty?
|
334
|
-
glob.map { |f| Pod::Specification.from_file(f) }
|
362
|
+
glob.map { |f| Pod::Specification.from_file(f) }.sort_by(&:name)
|
335
363
|
else
|
336
364
|
Pod::Specification.from_file(path)
|
337
365
|
end
|
@@ -9,19 +9,19 @@ module Pod
|
|
9
9
|
#
|
10
10
|
attr_reader :configuration
|
11
11
|
|
12
|
-
# @return [Specification]
|
12
|
+
# @return [Array<Specification>]
|
13
13
|
# the spec whose workspace is being created
|
14
14
|
#
|
15
|
-
attr_reader :
|
15
|
+
attr_reader :specs
|
16
16
|
|
17
17
|
# @return [Podfile]
|
18
18
|
# the podfile to install
|
19
19
|
#
|
20
20
|
attr_reader :podfile
|
21
21
|
|
22
|
-
def initialize(configuration,
|
22
|
+
def initialize(configuration, specs, podfile)
|
23
23
|
@configuration = configuration
|
24
|
-
@
|
24
|
+
@specs = specs
|
25
25
|
@podfile = podfile
|
26
26
|
end
|
27
27
|
|
@@ -37,7 +37,7 @@ module Pod
|
|
37
37
|
# @return [void]
|
38
38
|
#
|
39
39
|
def install!
|
40
|
-
UI.title "Generating
|
40
|
+
UI.title "Generating workspace in #{UI.path install_directory}" do
|
41
41
|
clean! if configuration.clean?
|
42
42
|
install_directory.mkpath
|
43
43
|
|
@@ -51,7 +51,12 @@ module Pod
|
|
51
51
|
|
52
52
|
installer = nil
|
53
53
|
UI.section 'Installing...' do
|
54
|
-
configuration.pod_config.with_changes(installation_root: install_directory, podfile: podfile,
|
54
|
+
configuration.pod_config.with_changes(installation_root: install_directory, podfile: podfile,
|
55
|
+
lockfile: configuration.lockfile, sandbox: nil,
|
56
|
+
sandbox_root: install_directory + 'Pods',
|
57
|
+
podfile_path: podfile.defined_in_file,
|
58
|
+
silent: !configuration.pod_config.verbose?, verbose: false,
|
59
|
+
lockfile_path: nil) do
|
55
60
|
installer = ::Pod::Installer.new(configuration.pod_config.sandbox, podfile, configuration.lockfile)
|
56
61
|
installer.use_default_plugins = configuration.use_default_plugins
|
57
62
|
installer.install!
|
@@ -59,7 +64,12 @@ module Pod
|
|
59
64
|
end
|
60
65
|
|
61
66
|
UI.section 'Performing post-installation steps' do
|
62
|
-
|
67
|
+
should_perform_post_install = if installer.respond_to?(:generated_aggregate_targets) # CocoaPods 1.7.0
|
68
|
+
!installer.generated_aggregate_targets.empty?
|
69
|
+
else
|
70
|
+
true
|
71
|
+
end
|
72
|
+
perform_post_install_steps(open_app_project, installer) if should_perform_post_install
|
63
73
|
end
|
64
74
|
|
65
75
|
print_post_install_message
|
@@ -79,7 +89,7 @@ module Pod
|
|
79
89
|
end
|
80
90
|
|
81
91
|
def open_app_project(recreate: false)
|
82
|
-
app_project_path = install_directory.join("#{
|
92
|
+
app_project_path = install_directory.join("#{configuration.project_name_for_specs(specs)}.xcodeproj")
|
83
93
|
if !recreate && app_project_path.exist?
|
84
94
|
Xcodeproj::Project.open(app_project_path)
|
85
95
|
else
|
@@ -92,31 +102,47 @@ module Pod
|
|
92
102
|
# @return [Xcodeproj::Project]
|
93
103
|
#
|
94
104
|
def create_app_project
|
95
|
-
app_project = open_app_project(recreate:
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
+
app_project = open_app_project(recreate: !configuration.incremental_installation?)
|
106
|
+
|
107
|
+
platforms_by_spec = Hash[specs.map do |spec|
|
108
|
+
platforms = spec.available_platforms.flatten.reject do |platform|
|
109
|
+
!configuration.platforms.nil? && !configuration.platforms.include?(platform.string_name.downcase)
|
110
|
+
end
|
111
|
+
[spec, platforms]
|
112
|
+
end]
|
113
|
+
|
114
|
+
if platforms_by_spec.values.all?(&:empty?)
|
115
|
+
Pod::Command::Gen.help! Pod::StandardError.new "No available platforms for podspecs #{specs.map(&:name).to_sentence} match requested platforms: #{configuration.platforms}"
|
105
116
|
end
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
117
|
+
|
118
|
+
platforms_by_spec
|
119
|
+
.flat_map do |spec, platforms|
|
120
|
+
platforms.map do |platform|
|
121
|
+
consumer = spec.consumer(platform)
|
122
|
+
target_name = "App-#{Platform.string_name(consumer.platform_name)}"
|
123
|
+
next if app_project.targets.map(&:name).include? target_name
|
124
|
+
native_app_target = Pod::Generator::AppTargetHelper.add_app_target(app_project, consumer.platform_name,
|
125
|
+
deployment_target(consumer), target_name)
|
126
|
+
# Temporarily set Swift version to pass validator checks for pods which do not specify Swift version.
|
127
|
+
# It will then be re-set again within #perform_post_install_steps.
|
128
|
+
Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, Pod::Validator::DEFAULT_SWIFT_VERSION)
|
129
|
+
native_app_target
|
114
130
|
end
|
115
|
-
|
116
|
-
|
131
|
+
end
|
132
|
+
.compact.uniq.tap do
|
133
|
+
app_project.recreate_user_schemes do |scheme, target|
|
134
|
+
installation_result = installation_result_from_target(target)
|
135
|
+
next unless installation_result
|
136
|
+
installation_result.test_native_targets.each do |test_native_target|
|
137
|
+
scheme.add_test_target(test_native_target)
|
138
|
+
end
|
117
139
|
end
|
118
|
-
|
140
|
+
end
|
141
|
+
.each do |target|
|
142
|
+
Xcodeproj::XCScheme.share_scheme(app_project.path.to_s, target.name) if target
|
143
|
+
end
|
119
144
|
app_project.save
|
145
|
+
app_project
|
120
146
|
end
|
121
147
|
|
122
148
|
def deployment_target(consumer)
|
@@ -132,8 +158,13 @@ module Pod
|
|
132
158
|
app_project.native_targets.each do |native_app_target|
|
133
159
|
remove_script_phase_from_target(native_app_target, 'Check Pods Manifest.lock')
|
134
160
|
|
135
|
-
|
136
|
-
|
161
|
+
spec_names = specs.map(&:name)
|
162
|
+
pod_targets = installer.pod_targets.select do |pt|
|
163
|
+
pt.platform.name == native_app_target.platform_name && spec_names.include?(pt.pod_name)
|
164
|
+
end
|
165
|
+
|
166
|
+
native_app_target.source_build_phase.clear
|
167
|
+
native_app_target.resources_build_phase.clear
|
137
168
|
|
138
169
|
if (app_host_source_dir = configuration.app_host_source_dir)
|
139
170
|
relative_app_host_source_dir = app_host_source_dir.relative_path_from(installer.sandbox.root)
|
@@ -166,10 +197,18 @@ module Pod
|
|
166
197
|
source_file_ref = group.new_file(file.basename)
|
167
198
|
native_app_target.add_file_references([source_file_ref])
|
168
199
|
end
|
169
|
-
elsif Pod::Generator::AppTargetHelper.method(:add_app_project_import).arity == -5 # CocoaPods >= 1.6
|
170
|
-
Pod::Generator::AppTargetHelper.add_app_project_import(app_project, native_app_target, pod_target, pod_target.platform.name, native_app_target.name)
|
171
200
|
else
|
172
|
-
|
201
|
+
platform_name = Platform.string_name(native_app_target.platform_name)
|
202
|
+
group = group_for_platform_name(app_project, platform_name)
|
203
|
+
main_file_ref = group.files.find { |f| f.display_name == 'main.m' }
|
204
|
+
if main_file_ref.nil?
|
205
|
+
source_file = create_main_source_file(app_project, pod_targets, native_app_target.name)
|
206
|
+
group = app_project[group.name] || app_project.new_group(group.name, group.name)
|
207
|
+
source_file_ref = group.new_file(source_file)
|
208
|
+
native_app_target.add_file_references([source_file_ref])
|
209
|
+
else
|
210
|
+
native_app_target.add_file_references([main_file_ref])
|
211
|
+
end
|
173
212
|
end
|
174
213
|
|
175
214
|
# Set `PRODUCT_BUNDLE_IDENTIFIER`
|
@@ -179,21 +218,25 @@ module Pod
|
|
179
218
|
|
180
219
|
case native_app_target.platform_name
|
181
220
|
when :ios
|
182
|
-
make_ios_app_launchable(
|
221
|
+
make_ios_app_launchable(app_project, native_app_target)
|
183
222
|
end
|
184
223
|
|
185
|
-
Pod::
|
224
|
+
swift_version = pod_targets.map { |pt| Pod::Version.new(pt.swift_version) }.max.to_s
|
225
|
+
|
226
|
+
Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, swift_version) unless swift_version.blank?
|
186
227
|
if installer.pod_targets.any? { |pt| pt.spec_consumers.any? { |c| c.frameworks.include?('XCTest') } }
|
187
228
|
Pod::Generator::AppTargetHelper.add_xctest_search_paths(native_app_target)
|
188
229
|
end
|
189
230
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
231
|
+
pod_targets.each do |pod_target|
|
232
|
+
result = installer.target_installation_results.pod_target_installation_results[pod_target.name]
|
233
|
+
share_scheme(result.native_target.project, pod_target.label)
|
234
|
+
pod_target.test_specs.each do |test_spec|
|
235
|
+
share_scheme(result.native_target.project, pod_target.test_target_label(test_spec))
|
236
|
+
end
|
237
|
+
pod_target.app_specs.each do |app_spec|
|
238
|
+
share_scheme(result.native_target.project, pod_target.app_target_label(app_spec))
|
194
239
|
end
|
195
|
-
elsif File.exist?(installer.pods_project.path + pod_target.label)
|
196
|
-
Xcodeproj::XCScheme.share_scheme(installer.pods_project.path, pod_target.label)
|
197
240
|
end
|
198
241
|
|
199
242
|
add_test_spec_schemes_to_app_scheme(installer, app_project)
|
@@ -217,25 +260,22 @@ module Pod
|
|
217
260
|
end
|
218
261
|
|
219
262
|
def add_test_spec_schemes_to_app_scheme(installer, app_project)
|
263
|
+
spec_root_names = Set.new(specs.map { |s| s.root.name })
|
264
|
+
|
220
265
|
test_native_targets =
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
.select { |installation_result| installation_result.target.pod_name == spec.root.name }
|
228
|
-
else
|
229
|
-
installer
|
230
|
-
.pod_targets
|
231
|
-
.select { |pod_target| pod_target.pod_name == spec.root.name }
|
232
|
-
end
|
266
|
+
installer
|
267
|
+
.target_installation_results
|
268
|
+
.pod_target_installation_results
|
269
|
+
.values
|
270
|
+
.flatten(1)
|
271
|
+
.select { |installation_result| spec_root_names.include?(installation_result.target.pod_name) }
|
233
272
|
.flat_map(&:test_native_targets)
|
234
273
|
.group_by(&:platform_name)
|
235
274
|
|
275
|
+
workspace_path = install_directory + (configuration.project_name_for_specs(specs) + '.xcworkspace')
|
236
276
|
Xcodeproj::Plist.write_to_path(
|
237
277
|
{ 'IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded' => false },
|
238
|
-
|
278
|
+
workspace_path.join('xcshareddata').tap(&:mkpath).join('WorkspaceSettings.xcsettings')
|
239
279
|
)
|
240
280
|
|
241
281
|
test_native_targets.each do |platform_name, test_targets|
|
@@ -251,7 +291,7 @@ module Pod
|
|
251
291
|
|
252
292
|
testable = Xcodeproj::XCScheme::TestAction::TestableReference.new(target)
|
253
293
|
testable.buildable_references.each do |buildable|
|
254
|
-
buildable.xml_element.attributes['ReferencedContainer'] =
|
294
|
+
buildable.xml_element.attributes['ReferencedContainer'] = "container:Pods/#{File.basename(target.project.path)}"
|
255
295
|
end
|
256
296
|
test_action.add_testable(testable)
|
257
297
|
end
|
@@ -260,9 +300,9 @@ module Pod
|
|
260
300
|
end
|
261
301
|
end
|
262
302
|
|
263
|
-
def make_ios_app_launchable(
|
303
|
+
def make_ios_app_launchable(app_project, native_app_target)
|
264
304
|
platform_name = Platform.string_name(native_app_target.platform_name)
|
265
|
-
generated_source_dir =
|
305
|
+
generated_source_dir = install_directory.join("App-#{platform_name}").tap(&:mkpath)
|
266
306
|
|
267
307
|
# Add `LaunchScreen.storyboard`
|
268
308
|
launch_storyboard = generated_source_dir.join('LaunchScreen.storyboard')
|
@@ -323,12 +363,17 @@ module Pod
|
|
323
363
|
Xcodeproj::Plist.write_to_path(info_plist_contents, info_plist_path)
|
324
364
|
|
325
365
|
native_app_target.build_configurations.each do |bc|
|
326
|
-
bc.build_settings['INFOPLIST_FILE'] = "${SRCROOT}/App
|
366
|
+
bc.build_settings['INFOPLIST_FILE'] = "${SRCROOT}/App-#{platform_name}/Info.plist"
|
327
367
|
end
|
328
368
|
|
329
|
-
group = app_project
|
330
|
-
group.new_file(info_plist_path)
|
331
|
-
|
369
|
+
group = group_for_platform_name(app_project, platform_name)
|
370
|
+
group.files.find { |f| f.display_name == 'Info.plist' } || group.new_file(info_plist_path)
|
371
|
+
launch_storyboard_file_ref = group.files.find { |f| f.display_name == 'LaunchScreen.storyboard' } || group.new_file(launch_storyboard)
|
372
|
+
native_app_target.resources_build_phase.add_file_reference(launch_storyboard_file_ref)
|
373
|
+
end
|
374
|
+
|
375
|
+
def group_for_platform_name(project, platform_name, should_create = true)
|
376
|
+
project.main_group.find_subpath("App-#{platform_name}", should_create)
|
332
377
|
end
|
333
378
|
|
334
379
|
def print_post_install_message
|
@@ -339,8 +384,36 @@ module Pod
|
|
339
384
|
Executable.execute_command 'open', [workspace_path]
|
340
385
|
end
|
341
386
|
else
|
342
|
-
UI.info "Open #{UI.path workspace_path} to work on
|
387
|
+
UI.info "Open #{UI.path workspace_path} to work on it!"
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
def share_scheme(project, scheme_name)
|
392
|
+
scheme = Xcodeproj::XCScheme.user_data_dir(project.path) + "#{scheme_name}.xcscheme"
|
393
|
+
return unless File.exist?(scheme)
|
394
|
+
Xcodeproj::XCScheme.share_scheme(project.path, scheme_name)
|
395
|
+
end
|
396
|
+
|
397
|
+
def create_main_source_file(project, pod_targets, name)
|
398
|
+
source_file = project.path.dirname.+("#{name}/main.m")
|
399
|
+
source_file.parent.mkpath
|
400
|
+
|
401
|
+
import_statements = pod_targets.map do |pod_target|
|
402
|
+
if pod_target.should_build? && pod_target.defines_module?
|
403
|
+
"@import #{pod_target.product_module_name};"
|
404
|
+
else
|
405
|
+
header_name = "#{pod_target.product_module_name}/#{pod_target.product_module_name}.h"
|
406
|
+
"#import <#{header_name}>" if pod_target.sandbox.public_headers.root.+(header_name).file?
|
407
|
+
end
|
408
|
+
end.compact
|
409
|
+
|
410
|
+
source_file.open('w') do |f|
|
411
|
+
f << import_statements.join("\n")
|
412
|
+
f << "\n" unless import_statements.empty?
|
413
|
+
f << "int main() { return 0; }\n"
|
343
414
|
end
|
415
|
+
|
416
|
+
source_file
|
344
417
|
end
|
345
418
|
end
|
346
419
|
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,12 @@ module Pod
|
|
89
98
|
end
|
90
99
|
end
|
91
100
|
|
92
|
-
# Add platform-specific concrete targets that inherit the
|
93
|
-
|
94
|
-
|
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|
|
103
|
+
!generator.configuration.platforms.nil? && !generator.configuration.platforms.include?(platform_name.downcase)
|
104
|
+
end
|
105
|
+
|
106
|
+
spec_platform_names.sort.each do |platform_name|
|
95
107
|
target "App-#{platform_name}" do
|
96
108
|
current_target_definition.swift_version = generator.swift_version if generator.swift_version
|
97
109
|
end
|
@@ -112,50 +124,59 @@ module Pod
|
|
112
124
|
inhibit_all_warnings! if generator.inhibit_all_warnings?
|
113
125
|
use_modular_headers! if generator.use_modular_headers?
|
114
126
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
{ testspecs: test_specs, appspecs: app_specs }.each do |key, specs|
|
120
|
-
pod_options[key] = specs.map { |s| s.name.sub(%r{^#{Regexp.escape spec.root.name}/}, '') }.sort unless specs.empty?
|
121
|
-
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)
|
122
131
|
|
123
|
-
|
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
|
124
139
|
|
125
140
|
# Implement local-sources option to set up dependencies to podspecs in the local filesystem.
|
126
141
|
next if generator.configuration.local_sources.empty?
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
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
|
135
152
|
end
|
136
153
|
end
|
137
154
|
end
|
138
155
|
|
139
|
-
def transitive_local_dependencies(spec, paths)
|
140
|
-
|
141
|
-
|
142
|
-
|
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)
|
143
167
|
found_podspec_file = nil
|
144
168
|
name = dependency.name.split('/')[0]
|
145
169
|
paths.each do |path|
|
146
|
-
podspec_file = path
|
170
|
+
podspec_file = File.join(path, name + '.podspec')
|
147
171
|
next unless File.file?(podspec_file)
|
148
172
|
found_podspec_file = podspec_file
|
149
173
|
break
|
150
174
|
end
|
151
175
|
next unless found_podspec_file
|
152
|
-
|
153
|
-
|
154
|
-
dep_spec.dependencies.each do |d_dep|
|
155
|
-
dependencies << d_dep unless dependencies.include? d_dep
|
156
|
-
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)
|
157
178
|
end
|
158
|
-
|
179
|
+
found_podspecs
|
159
180
|
end
|
160
181
|
|
161
182
|
# @return [Boolean]
|
@@ -185,6 +206,27 @@ module Pod
|
|
185
206
|
end
|
186
207
|
end
|
187
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
|
+
|
188
230
|
# @return [Hash]
|
189
231
|
# a hash with "compilation"-related dependency options for the `pod` DSL method
|
190
232
|
#
|
@@ -295,7 +337,7 @@ module Pod
|
|
295
337
|
def installation_options
|
296
338
|
installation_options = {
|
297
339
|
deterministic_uuids: configuration.deterministic_uuids?,
|
298
|
-
share_schemes_for_development_pods: configuration.share_schemes_for_development_pods
|
340
|
+
share_schemes_for_development_pods: configuration.share_schemes_for_development_pods,
|
299
341
|
warn_for_multiple_pod_sources: configuration.warn_for_multiple_pod_sources?
|
300
342
|
}
|
301
343
|
|
@@ -307,6 +349,10 @@ module Pod
|
|
307
349
|
installation_options[:incremental_installation] = configuration.incremental_installation?
|
308
350
|
end
|
309
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
|
+
|
310
356
|
installation_options
|
311
357
|
end
|
312
358
|
|
@@ -349,6 +395,7 @@ module Pod
|
|
349
395
|
#
|
350
396
|
def modular_headers?(pod_name)
|
351
397
|
return true if configuration.use_modular_headers?
|
398
|
+
return false unless configuration.use_podfile?
|
352
399
|
target_definitions_for_pod(pod_name).all? do |target_definition|
|
353
400
|
target_definition.build_pod_as_module?(pod_name)
|
354
401
|
end
|
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: 1.
|
4
|
+
version: 2.1.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-04 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.0.
|
105
|
-
signing_key:
|
104
|
+
rubygems_version: 3.0.3
|
105
|
+
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: Generates Xcode workspaces from a podspec.
|
108
108
|
test_files: []
|