cocoapods-generate 1.6.0 → 2.0.0
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/VERSION +1 -1
- data/lib/cocoapods/command/gen.rb +4 -2
- data/lib/cocoapods/generate/configuration.rb +14 -1
- data/lib/cocoapods/generate/installer.rb +53 -18
- data/lib/cocoapods/generate/podfile_generator.rb +40 -14
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea3b44ab5fbc8842aebc11de2fc54cfc3767a27a5295495ddc4ee615a992ad08
|
4
|
+
data.tar.gz: 2e59a2c711cd98ee9c7ce4f6c25d80c88f4bc0a88ade7402fe67ebd0c241df7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dae3e8cedabed45368ad1642409929363e101e25fb156d2e684ccf158fd01627381aa10558611e7a0f0380e924b83f681a571f742e7397be5f08304040fb2b86
|
7
|
+
data.tar.gz: 4acc9aa5dcba8768e7fe33f3c0c3cb564e088505d513f9692f2efd6a944a80d216e417409f91a13f6373fb1b1d0596fd395ea449559051f5418ae4ff1aac43af
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
@@ -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) }
|
@@ -316,6 +316,19 @@ module Pod
|
|
316
316
|
!use_libraries?
|
317
317
|
end
|
318
318
|
|
319
|
+
# @return [String] The project name to use for generating this workspace.
|
320
|
+
#
|
321
|
+
# @param [Specification] spec
|
322
|
+
# the specification to generate project name for.
|
323
|
+
#
|
324
|
+
def project_name_for_spec(spec)
|
325
|
+
project_name = spec.name.dup
|
326
|
+
# When using multiple Xcode project the project name will collide with the actual .xcodeproj meant for the pod
|
327
|
+
# that we are generating the workspace for.
|
328
|
+
project_name << 'Sample' if generate_multiple_pod_projects?
|
329
|
+
project_name
|
330
|
+
end
|
331
|
+
|
319
332
|
# @return [Array<Specification>] the podspecs found at the given paths.
|
320
333
|
# This method will download specs from URLs and traverse a directory's children.
|
321
334
|
#
|
@@ -340,7 +353,7 @@ module Pod
|
|
340
353
|
elsif path.directory?
|
341
354
|
glob = Pathname.glob(path + '*.podspec{.json,}')
|
342
355
|
next StandardError.new "no specs found in #{UI.path path}" if glob.empty?
|
343
|
-
glob.map { |f| Pod::Specification.from_file(f) }
|
356
|
+
glob.map { |f| Pod::Specification.from_file(f) }.sort_by(&:name)
|
344
357
|
else
|
345
358
|
Pod::Specification.from_file(path)
|
346
359
|
end
|
@@ -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("#{spec
|
92
|
+
app_project_path = install_directory.join("#{configuration.project_name_for_spec(spec)}.xcodeproj")
|
83
93
|
if !recreate && app_project_path.exist?
|
84
94
|
Xcodeproj::Project.open(app_project_path)
|
85
95
|
else
|
@@ -92,25 +102,29 @@ module Pod
|
|
92
102
|
# @return [Xcodeproj::Project]
|
93
103
|
#
|
94
104
|
def create_app_project
|
95
|
-
app_project = open_app_project(recreate:
|
105
|
+
app_project = open_app_project(recreate: !configuration.incremental_installation?)
|
96
106
|
|
97
107
|
spec_platforms = spec.available_platforms.flatten.reject do |platform|
|
98
108
|
!configuration.platforms.nil? && !configuration.platforms.include?(platform.string_name.downcase)
|
99
109
|
end
|
100
110
|
|
101
|
-
|
111
|
+
if spec_platforms.empty?
|
112
|
+
Pod::Command::Gen.help! Pod::StandardError.new "No available platforms in #{spec.name}.podspec match requested platforms: #{configuration.platforms}"
|
113
|
+
end
|
102
114
|
|
103
115
|
spec_platforms
|
104
116
|
.map do |platform|
|
105
117
|
consumer = spec.consumer(platform)
|
106
118
|
target_name = "App-#{Platform.string_name(consumer.platform_name)}"
|
107
|
-
|
119
|
+
next if app_project.targets.map(&:name).include? target_name
|
120
|
+
native_app_target = Pod::Generator::AppTargetHelper.add_app_target(app_project, consumer.platform_name,
|
121
|
+
deployment_target(consumer), target_name)
|
108
122
|
# Temporarily set Swift version to pass validator checks for pods which do not specify Swift version.
|
109
123
|
# It will then be re-set again within #perform_post_install_steps.
|
110
124
|
Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, Pod::Validator::DEFAULT_SWIFT_VERSION)
|
111
125
|
native_app_target
|
112
126
|
end
|
113
|
-
.tap do
|
127
|
+
.compact.tap do
|
114
128
|
app_project.recreate_user_schemes do |scheme, target|
|
115
129
|
installation_result = installation_result_from_target(target)
|
116
130
|
next unless installation_result
|
@@ -139,7 +153,10 @@ module Pod
|
|
139
153
|
remove_script_phase_from_target(native_app_target, 'Check Pods Manifest.lock')
|
140
154
|
|
141
155
|
pod_target = installer.pod_targets.find { |pt| pt.platform.name == native_app_target.platform_name && pt.pod_name == spec.name }
|
142
|
-
raise "
|
156
|
+
raise "Unable to find a pod target for #{native_app_target} / #{spec}" unless pod_target
|
157
|
+
|
158
|
+
native_app_target.source_build_phase.clear
|
159
|
+
native_app_target.resources_build_phase.clear
|
143
160
|
|
144
161
|
if (app_host_source_dir = configuration.app_host_source_dir)
|
145
162
|
relative_app_host_source_dir = app_host_source_dir.relative_path_from(installer.sandbox.root)
|
@@ -173,9 +190,21 @@ module Pod
|
|
173
190
|
native_app_target.add_file_references([source_file_ref])
|
174
191
|
end
|
175
192
|
elsif Pod::Generator::AppTargetHelper.method(:add_app_project_import).arity == -5 # CocoaPods >= 1.6
|
176
|
-
|
193
|
+
# If we are doing incremental installation then the file might already be there.
|
194
|
+
platform_name = Platform.string_name(native_app_target.platform_name)
|
195
|
+
group = group_for_platform_name(app_project, platform_name)
|
196
|
+
main_file_ref = group.files.find { |f| f.display_name == 'main.m' }
|
197
|
+
if main_file_ref.nil?
|
198
|
+
Pod::Generator::AppTargetHelper.add_app_project_import(app_project, native_app_target, pod_target,
|
199
|
+
pod_target.platform.name, native_app_target.name)
|
200
|
+
else
|
201
|
+
native_app_target.add_file_references([main_file_ref])
|
202
|
+
end
|
177
203
|
else
|
178
|
-
Pod::Generator::AppTargetHelper.add_app_project_import(app_project, native_app_target, pod_target,
|
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)
|
179
208
|
end
|
180
209
|
|
181
210
|
# Set `PRODUCT_BUNDLE_IDENTIFIER`
|
@@ -185,7 +214,7 @@ module Pod
|
|
185
214
|
|
186
215
|
case native_app_target.platform_name
|
187
216
|
when :ios
|
188
|
-
make_ios_app_launchable(
|
217
|
+
make_ios_app_launchable(app_project, native_app_target)
|
189
218
|
end
|
190
219
|
|
191
220
|
Pod::Generator::AppTargetHelper.add_swift_version(native_app_target, pod_target.swift_version) unless pod_target.swift_version.blank?
|
@@ -239,9 +268,10 @@ module Pod
|
|
239
268
|
.flat_map(&:test_native_targets)
|
240
269
|
.group_by(&:platform_name)
|
241
270
|
|
271
|
+
workspace_path = install_directory + "#{spec.name}.xcworkspace"
|
242
272
|
Xcodeproj::Plist.write_to_path(
|
243
273
|
{ 'IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded' => false },
|
244
|
-
|
274
|
+
workspace_path.join('xcshareddata').tap(&:mkpath).join('WorkspaceSettings.xcsettings')
|
245
275
|
)
|
246
276
|
|
247
277
|
test_native_targets.each do |platform_name, test_targets|
|
@@ -266,9 +296,9 @@ module Pod
|
|
266
296
|
end
|
267
297
|
end
|
268
298
|
|
269
|
-
def make_ios_app_launchable(
|
299
|
+
def make_ios_app_launchable(app_project, native_app_target)
|
270
300
|
platform_name = Platform.string_name(native_app_target.platform_name)
|
271
|
-
generated_source_dir =
|
301
|
+
generated_source_dir = install_directory.join("App-#{platform_name}").tap(&:mkpath)
|
272
302
|
|
273
303
|
# Add `LaunchScreen.storyboard`
|
274
304
|
launch_storyboard = generated_source_dir.join('LaunchScreen.storyboard')
|
@@ -329,12 +359,17 @@ module Pod
|
|
329
359
|
Xcodeproj::Plist.write_to_path(info_plist_contents, info_plist_path)
|
330
360
|
|
331
361
|
native_app_target.build_configurations.each do |bc|
|
332
|
-
bc.build_settings['INFOPLIST_FILE'] = "${SRCROOT}/App
|
362
|
+
bc.build_settings['INFOPLIST_FILE'] = "${SRCROOT}/App-#{platform_name}/Info.plist"
|
333
363
|
end
|
334
364
|
|
335
|
-
group = app_project
|
336
|
-
group.new_file(info_plist_path)
|
337
|
-
|
365
|
+
group = group_for_platform_name(app_project, platform_name)
|
366
|
+
group.files.find { |f| f.display_name == 'Info.plist' } || group.new_file(info_plist_path)
|
367
|
+
launch_storyboard_file_ref = group.files.find { |f| f.display_name == 'LaunchScreen.storyboard' } || group.new_file(launch_storyboard)
|
368
|
+
native_app_target.resources_build_phase.add_file_reference(launch_storyboard_file_ref)
|
369
|
+
end
|
370
|
+
|
371
|
+
def group_for_platform_name(project, platform_name, should_create = true)
|
372
|
+
project.main_group.find_subpath("App-#{platform_name}", should_create)
|
338
373
|
end
|
339
374
|
|
340
375
|
def print_post_install_message
|
@@ -30,9 +30,10 @@ module Pod
|
|
30
30
|
def podfile_for_spec(spec)
|
31
31
|
generator = self
|
32
32
|
dir = configuration.gen_dir_for_pod(spec.name)
|
33
|
+
project_name = configuration.project_name_for_spec(spec)
|
33
34
|
|
34
35
|
Pod::Podfile.new do
|
35
|
-
project "#{
|
36
|
+
project "#{project_name}.xcodeproj"
|
36
37
|
workspace "#{spec.name}.xcworkspace"
|
37
38
|
|
38
39
|
plugin 'cocoapods-generate'
|
@@ -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)
|
@@ -128,7 +129,7 @@ module Pod
|
|
128
129
|
|
129
130
|
# Implement local-sources option to set up dependencies to podspecs in the local filesystem.
|
130
131
|
next if generator.configuration.local_sources.empty?
|
131
|
-
generator.transitive_local_dependencies(spec, generator.configuration.local_sources).each do |dependency, podspec_file|
|
132
|
+
generator.transitive_local_dependencies(spec, generator.configuration.local_sources).sort_by(&:first).each do |dependency, podspec_file|
|
132
133
|
pod_options = generator.dependency_compilation_kwargs(dependency.name)
|
133
134
|
pod_options[:path] = if podspec_file[0] == '/' # absolute path
|
134
135
|
podspec_file
|
@@ -140,26 +141,30 @@ module Pod
|
|
140
141
|
end
|
141
142
|
end
|
142
143
|
|
143
|
-
def transitive_local_dependencies(spec, paths)
|
144
|
-
|
145
|
-
|
146
|
-
|
144
|
+
def transitive_local_dependencies(spec, paths, found_podspecs: {}, include_non_library_subspecs: true)
|
145
|
+
if include_non_library_subspecs
|
146
|
+
non_library_specs = spec.recursive_subspecs.select do |ss|
|
147
|
+
ss.test_specification? || (ss.respond_to?(:app_specification?) && ss.app_specification?)
|
148
|
+
end
|
149
|
+
non_library_specs.each do |subspec|
|
150
|
+
transitive_local_dependencies(subspec, paths, found_podspecs: found_podspecs, include_non_library_subspecs: false)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
spec.dependencies.each do |dependency|
|
154
|
+
next if found_podspecs.key?(dependency)
|
147
155
|
found_podspec_file = nil
|
148
156
|
name = dependency.name.split('/')[0]
|
149
157
|
paths.each do |path|
|
150
|
-
podspec_file = path
|
158
|
+
podspec_file = File.join(path, name + '.podspec')
|
151
159
|
next unless File.file?(podspec_file)
|
152
160
|
found_podspec_file = podspec_file
|
153
161
|
break
|
154
162
|
end
|
155
163
|
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
|
164
|
+
found_podspecs[dependency] = found_podspec_file.sub(%r{\A\./}, '')
|
165
|
+
transitive_local_dependencies(Pod::Specification.from_file(found_podspec_file), paths, found_podspecs: found_podspecs)
|
161
166
|
end
|
162
|
-
|
167
|
+
found_podspecs
|
163
168
|
end
|
164
169
|
|
165
170
|
# @return [Boolean]
|
@@ -189,6 +194,27 @@ module Pod
|
|
189
194
|
end
|
190
195
|
end
|
191
196
|
|
197
|
+
# @return [Boolean, Hash]
|
198
|
+
# the value to use for `use_frameworks!` DSL directive
|
199
|
+
#
|
200
|
+
def use_frameworks_value
|
201
|
+
return configuration.use_frameworks? unless configuration.use_podfile?
|
202
|
+
use_framework_values = target_definition_list.map do |target_definition|
|
203
|
+
if target_definition.respond_to?(:build_type) # CocoaPods >= 1.9
|
204
|
+
build_type = target_definition.build_type
|
205
|
+
if build_type.static_library?
|
206
|
+
false
|
207
|
+
else
|
208
|
+
{ linkage: build_type == BuildType.dynamic_framework ? :dynamic : :static }
|
209
|
+
end
|
210
|
+
else
|
211
|
+
target_definition.uses_frameworks?
|
212
|
+
end
|
213
|
+
end.uniq
|
214
|
+
raise Informative, 'Multiple use_frameworks! values detected in user Podfile.' unless use_framework_values.count == 1
|
215
|
+
use_framework_values.first
|
216
|
+
end
|
217
|
+
|
192
218
|
# @return [Hash]
|
193
219
|
# a hash with "compilation"-related dependency options for the `pod` DSL method
|
194
220
|
#
|
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.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Giddins
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cocoapods-disable-podfile-validations
|
@@ -101,7 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
|
-
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 2.7.7
|
105
106
|
signing_key:
|
106
107
|
specification_version: 4
|
107
108
|
summary: Generates Xcode workspaces from a podspec.
|