cocoapods-mtxx-bin 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,381 @@
1
+
2
+ module CBin
3
+ module BuildAll
4
+ class Builder
5
+ include Pod
6
+
7
+ def initialize(pod_target, checkout_sources)
8
+ @pod_target = pod_target
9
+ @checkout_sources = checkout_sources
10
+ @file_accessors = pod_target.file_accessors unless pod_target.nil?
11
+ @base_dir = "#{Pathname.pwd}/build_pods"
12
+ end
13
+
14
+ # 构建
15
+ def build
16
+ UI.info "编译#{@pod_target}".yellow
17
+ dir = result_product_dir
18
+ FileUtils.rm_rf(dir) if File.exist?(dir)
19
+ # 编译模拟器
20
+ result = build_pod_target
21
+ return false unless result
22
+ # 编译真机
23
+ build_pod_target(false )
24
+ end
25
+
26
+ # 创建binary
27
+ def create_binary
28
+ UI.info "创建#{@pod_target}.framework".yellow
29
+ # 如果是framework需要先copy
30
+ if build_as_framework
31
+ copy_framework
32
+ else
33
+ create_framework_dir
34
+ end
35
+ # 合并真机模拟器
36
+ merge_device_sim
37
+ # 如果是lib需要拷贝头文件
38
+ unless build_as_framework
39
+ copy_headers
40
+ copy_headers(false )
41
+ generate_umbrella_header
42
+ generate_module_map
43
+ compile_resources
44
+ if @pod_target.uses_swift?
45
+ copy_swiftmodules
46
+ end
47
+ end
48
+ # 拷贝资源文件
49
+ copy_resources
50
+ # 拷贝 vendored_frameworks 和 vendored_libraries
51
+ copy_vendored_frameworks
52
+ copy_vendored_libraries
53
+ end
54
+
55
+ # 是否以framework形式构建
56
+ def build_as_framework
57
+ path = "#{product_dir}/#{iphoneos}/#{@pod_target}/#{@pod_target.framework_name}"
58
+ File.exist?(path)
59
+ end
60
+
61
+ # xxx.framework/Modules
62
+ def modules_dir
63
+ "#{result_product_dir}/Modules"
64
+ end
65
+
66
+ # xxx.framework/Headers
67
+ def headers_dir
68
+ "#{result_product_dir}/Headers"
69
+ end
70
+
71
+ # xxx.framework/PrivateHeaders
72
+ def private_headers_dir
73
+ "#{result_product_dir}/PrivateHeaders"
74
+ end
75
+
76
+ # xxx.framework/resources
77
+ def resources_dir
78
+ "#{result_product_dir}/resources"
79
+ end
80
+
81
+ # xxx.framework
82
+ def result_product_dir
83
+ "#{product_dir}/#{@pod_target.framework_name}"
84
+ end
85
+
86
+ # xxx.framework 所在目录
87
+ def product_dir
88
+ @product_dir = "#{@base_dir}/#{@pod_target}/Products"
89
+ @product_dir
90
+ end
91
+
92
+ # 构建临时产物目录
93
+ def temp_dir
94
+ "#{@base_dir}/#{@pod_target}/Temp"
95
+ end
96
+
97
+ def iphoneos
98
+ "Release-iphoneos"
99
+ end
100
+
101
+ def iphonesimulator
102
+ "Release-iphonesimulator"
103
+ end
104
+
105
+ # 需要排除的资源文件后缀
106
+ def reject_resource_ext
107
+ %w[.xcdatamodeld .xcdatamodel .xcmappingmodel .xib .storyboard]
108
+ end
109
+
110
+ private
111
+
112
+ # 构建单个pod
113
+ def build_pod_target(simulator = true)
114
+ sdk = simulator ? 'iphonesimulator' : 'iphoneos'
115
+ archs = simulator ? 'x86_64' : 'arm64'
116
+ product_dir = product_dir()
117
+ temp_dir = temp_dir()
118
+ pod_project_path = Dir.pwd + "/Pods/#{@pod_target}.xcodeproj"
119
+ if File.exist?(pod_project_path)
120
+ project = "./Pods/#{@pod_target}.xcodeproj"
121
+ else
122
+ project = "./Pods/Pods.xcodeproj"
123
+ end
124
+ command = <<-BUILD
125
+ xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(inherited)' \
126
+ GCC_WARN_INHIBIT_ALL_WARNINGS=YES \
127
+ -sdk #{sdk} \
128
+ ARCHS=#{archs} \
129
+ CONFIGURATION_TEMP_DIR=#{temp_dir} \
130
+ BUILD_ROOT=#{product_dir} \
131
+ BUILD_DIR=#{product_dir} \
132
+ clean build \
133
+ -configuration Release \
134
+ -target #{@pod_target} \
135
+ -project #{project}
136
+ BUILD
137
+ UI.info "#{command}"
138
+ `#{command}`
139
+ if $CHILD_STATUS.exitstatus != 0
140
+ UI.info "#{@pod_target}(#{sdk}) 编译失败!".red
141
+ return false
142
+ end
143
+ return true
144
+ end
145
+
146
+ # 合并真机模拟器
147
+ def merge_device_sim
148
+ if build_as_framework
149
+ device_lib_dir = "#{product_dir}/#{iphoneos}/#{@pod_target}/#{@pod_target.framework_name}/#{@pod_target.product_module_name}"
150
+ sim_lib_dir = "#{product_dir}/#{iphonesimulator}/#{@pod_target}/#{@pod_target.framework_name}/#{@pod_target.product_module_name}"
151
+ else
152
+ device_lib_dir = "#{product_dir}/#{iphoneos}/#{@pod_target}/#{@pod_target.static_library_name}"
153
+ sim_lib_dir = "#{product_dir}/#{iphonesimulator}/#{@pod_target}/#{@pod_target.static_library_name}"
154
+ end
155
+ output = "#{result_product_dir}/#{@pod_target.product_module_name}"
156
+ libs = [device_lib_dir, sim_lib_dir]
157
+ FileUtils.mkdir(result_product_dir) unless File.exist?(result_product_dir)
158
+ `lipo -create -output #{output} #{libs.join(' ')}` unless libs.empty?
159
+ end
160
+
161
+ # 创建 xxx.framework 文件夹
162
+ def create_framework_dir
163
+ fwk_path = "#{product_dir}/#{@pod_target.product_module_name}.framework"
164
+ FileUtils.rm_rf(fwk_path) if File.exist?(fwk_path)
165
+ FileUtils.mkdir(fwk_path)
166
+ end
167
+
168
+ # -------------------------- 编译需要编译的资源 --------------------------------
169
+
170
+ # 需要编译的资源
171
+ def need_compile_resources
172
+ return [] if @file_accessors.nil?
173
+ resources = @file_accessors.flat_map(&:resources)
174
+ return [] if resources.nil? || resources.size == 0
175
+ resources.compact.select { |res| reject_resource_ext.include?(res.extname) }.map(&:to_s)
176
+ end
177
+
178
+ # 编译需要编译的资源
179
+ def compile_resources
180
+ resources = need_compile_resources
181
+ resources.map { |res| compile_resource(res) }
182
+ end
183
+
184
+ # 编译单个资源
185
+ def compile_resource(resource)
186
+ return unless File.exist?(resource)
187
+ case File.extname(resource)
188
+ when '.storyboard', '.xib'
189
+ compile_storyboard_xib(resource)
190
+ when '.xcdatamodeld', '.xcdatamodel'
191
+ compile_xcdatamodel(resource)
192
+ when '.xcmappingmodel'
193
+ compile_xcmappingmodel(resource)
194
+ end
195
+ end
196
+
197
+ # 编译storyboard、xib
198
+ def compile_storyboard_xib(resource)
199
+ file_ext = File.extname(resource)
200
+ file_name = File.basename(resource, file_ext)
201
+ command = <<-COMMAND
202
+ ibtool \
203
+ --reference-external-strings-file \
204
+ --errors --warnings \
205
+ --notices \
206
+ --output-format human-readable-text \
207
+ --compile #{result_product_dir}/#{file_name}.#{file_ext == '.storyboard' ? 'storyboardc' : 'nib'} #{resource} \
208
+ --target-device ipad --target-device iphone
209
+ COMMAND
210
+ `#{command}`
211
+ end
212
+
213
+ # 编译xcdatamodel、xcdatamodeld
214
+ def compile_xcdatamodel(resource)
215
+ file_ext = File.extname(resource)
216
+ file_name = File.basename(resource, file_ext)
217
+ `xcrun momc #{resource} #{result_product_dir}/#{file_name}.#{file_ext == 'xcdatamodeld' ? 'momd' : 'mom'}`
218
+ end
219
+
220
+ # 编译xcmappingmodel
221
+ def compile_xcmappingmodel(resource)
222
+ file_ext = File.extname(resource)
223
+ file_name = File.basename(resource, file_ext)
224
+ `xcrun mapc #{resource} #{result_product_dir}/#{file_name}.cdm`
225
+ end
226
+
227
+ # -------------------------- 拷贝头文件、资源等 --------------------------------
228
+
229
+ # 拷贝头文件
230
+ def copy_headers(public = true)
231
+ if public
232
+ headers = @file_accessors.map(&:public_headers).flatten.compact.uniq
233
+ header_dir = headers_dir
234
+ if @pod_target.uses_swift?
235
+ umbrella_header = "#{product_dir}/#{iphoneos}/#{@pod_target}/#{@pod_target}-umbrella.h"
236
+ swift_header = "#{product_dir}/#{iphoneos}/#{@pod_target}/Swift\\ Compatibility\\ Header/#{@pod_target.product_module_name}-Swift.h"
237
+ headers.concat([umbrella_header, swift_header])
238
+ end
239
+ else
240
+ headers = @file_accessors.map(&:private_headers).flatten.compact.uniq
241
+ header_dir = private_headers_dir
242
+ end
243
+ return if headers.empty?
244
+ FileUtils.mkdir(header_dir) unless File.exist?(header_dir)
245
+ headers.map do |header|
246
+ header_path = header
247
+ if header.is_a?(String)
248
+ header_path = header.gsub(/ /, '\ ') if header.include?(' ')
249
+ elsif header.is_a?(Pathname)
250
+ header_path = header.to_s.gsub(/ /, '\ ') if header.to_s.include?(' ')
251
+ end
252
+ `cp -f #{header_path} #{header_dir}`
253
+ end
254
+ end
255
+
256
+ # 获取podspec中的resource_bundles
257
+ def resource_bundles
258
+ return [] if @file_accessors.nil?
259
+ resource_bundles = @file_accessors.flat_map(&:resource_bundles)
260
+ return [] if resource_bundles.nil? || resource_bundles.size == 0
261
+ resource_bundles.compact.flat_map(&:keys).map { |key| "#{product_dir}/#{iphoneos}/#{@pod_target}/#{key}.bundle" }
262
+ end
263
+
264
+ # 获取podspec中resource/resources
265
+ def other_resources
266
+ return [] if @file_accessors.nil?
267
+ resources = @file_accessors.flat_map(&:resources)
268
+ return [] if resources.nil? || resources.size == 0
269
+ resources.compact.reject { |res| reject_resource_ext.include?(res.extname) }.map(&:to_s)
270
+ end
271
+
272
+ # 拷贝资源文件
273
+ def copy_resources
274
+ resources = resource_bundles + other_resources
275
+ return if resources.empty?
276
+ resources_dir = "#{result_product_dir}/resources"
277
+ FileUtils.mkdir(resources_dir) unless File.exist?(resources_dir)
278
+ resources.uniq.map do |resource|
279
+ `rsync -av #{resource} #{resources_dir}`
280
+ end
281
+ end
282
+
283
+ # 拷贝 vendored_libraries
284
+ def copy_vendored_libraries
285
+ libs = @pod_target.file_accessors.map(&:vendored_libraries).flatten.compact.uniq
286
+ return if libs.empty?
287
+ libs_dir = "#{result_product_dir}/libs"
288
+ FileUtils.mkdir(libs_dir) unless File.exist?(libs_dir)
289
+ libs.map do |lib|
290
+ `rsync -av #{lib} #{libs_dir}`
291
+ end
292
+ end
293
+
294
+ # 拷贝 vendored_frameworks
295
+ def copy_vendored_frameworks
296
+ fwks = @pod_target.file_accessors.map(&:vendored_frameworks).flatten.compact.uniq
297
+ return if fwks.empty?
298
+ fwks_dir = "#{result_product_dir}/fwks"
299
+ FileUtils.mkdir(fwks_dir) unless File.exist?(fwks_dir)
300
+ fwks.map do |fwk|
301
+ `rsync -av #{fwk} #{fwks_dir}`
302
+ end
303
+ end
304
+
305
+ # 拷贝 framework
306
+ def copy_framework
307
+ source_path = "#{product_dir}/#{iphoneos}/#{@pod_target}/#{@pod_target.framework_name}"
308
+ if File.exist?(source_path)
309
+ `rsync -av #{source_path} #{product_dir}`
310
+ end
311
+ # 如果包含Swift代码,需要copy swiftmodules
312
+ if @pod_target.uses_swift?
313
+ copy_swiftmodules
314
+ end
315
+ end
316
+
317
+ # 拷贝swiftmodule
318
+ def copy_swiftmodules
319
+ if build_as_framework
320
+ swift_module = "#{modules_dir}/#{@pod_target.product_module_name}.swiftmodule"
321
+ src_swift = "#{product_dir}/#{iphonesimulator}/#{@pod_target}/#{@pod_target.framework_name}/Modules/#{@pod_target.product_module_name}.swiftmodule"
322
+ else
323
+ FileUtils.mkdir(modules_dir) unless File.exist?(modules_dir)
324
+ `cp -rf #{product_dir}/#{iphoneos}/#{@pod_target}/#{@pod_target.product_module_name}.swiftmodule #{modules_dir}`
325
+ swift_module = "#{modules_dir}/#{@pod_target.product_module_name}.swiftmodule"
326
+ src_swift = "#{product_dir}/#{iphonesimulator}/#{@pod_target}/#{@pod_target.product_module_name}.swiftmodule"
327
+ end
328
+ if File.exist?(swift_module)
329
+ `cp -af #{src_swift}/* #{swift_module}`
330
+ `cp -af #{src_swift}/Project/* #{swift_module}/Project`
331
+ end
332
+ end
333
+
334
+ # -------------------------- LLVM module --------------------------------
335
+
336
+ # 生成 module map
337
+ def generate_module_map
338
+ module_map = "#{modules_dir}/module.modulemap"
339
+ FileUtils.mkdir(modules_dir) unless File.exist?(modules_dir)
340
+ FileUtils.rm_f(module_map) if File.exist?(module_map)
341
+ File.open(module_map, "w+") do |f|
342
+ content = <<-MODULEMAP
343
+ framework module #{@pod_target.product_module_name} {
344
+ umbrella header "#{@pod_target}-umbrella.h"
345
+
346
+ export *
347
+ module * { export * }
348
+ }
349
+ MODULEMAP
350
+ # 有Swift代码
351
+ if @pod_target.uses_swift?
352
+ content += <<-SWIFT
353
+
354
+ module #{@pod_target.product_module_name}.Swift {
355
+ header "#{@pod_target.product_module_name}-Swift.h"
356
+ requires objc
357
+ }
358
+ SWIFT
359
+ end
360
+ f.write(content)
361
+ end
362
+ end
363
+
364
+ # 生成 umbrella header
365
+ def generate_umbrella_header
366
+ umbrella_header_path = "#{headers_dir}/#{@pod_target}-umbrella.h"
367
+ return if File.exist?(umbrella_header_path)
368
+
369
+ umbrella_header = Pod::Generator::UmbrellaHeader.new(@pod_target)
370
+ # 需要导入的头文件
371
+ umbrella_header.imports = @file_accessors.flat_map(&:public_headers).compact.uniq.map { |header| header.basename }
372
+ FileUtils.mkdir(headers_dir) unless File.exist?(headers_dir)
373
+ result = umbrella_header.generate
374
+ File.open(umbrella_header_path, "w+") do |f|
375
+ f.write(result)
376
+ end
377
+ end
378
+
379
+ end
380
+ end
381
+ end
@@ -0,0 +1,137 @@
1
+
2
+ module CBin
3
+ module BuildAll
4
+ class PodspecUtil
5
+ include Pod
6
+
7
+ def initialize(pod_target, version, build_as_framework = false )
8
+ @pod_target = pod_target
9
+ @version = version
10
+ @build_as_framework = build_as_framework
11
+ end
12
+
13
+ # 创建二进制podspec
14
+ def create_binary_podspec
15
+ UI.info "创建二进制podspec:#{@pod_target}".yellow
16
+ spec = @pod_target.root_spec.to_hash
17
+ root_dir = @pod_target.framework_name
18
+ # 处理版本号
19
+ spec['version'] = version
20
+ # 处理source
21
+ spec['source'] = source
22
+ # 处理头文件
23
+ spec['source_files'] = "#{root_dir}/Headers/*.h"
24
+ spec['public_header_files'] = "#{root_dir}/Headers/*.h"
25
+ spec['private_header_files'] = "#{root_dir}/PrivateHeaders/*.h"
26
+ # 处理vendored_libraries和vendored_frameworks
27
+ spec['vendored_libraries'] = "#{root_dir}/libs/*.a"
28
+ spec['vendored_frameworks'] = %W[#{root_dir} #{root_dir}/fwks/*.framework]
29
+ # 处理资源
30
+ resources = %W[#{root_dir}/*.{#{special_resource_exts.join(',')}} #{root_dir}/resources/*]
31
+ spec['resources'] = resources
32
+ # 删除无用的字段
33
+ delete_unused(spec)
34
+ # 处理subspecs
35
+ handle_subspecs(spec)
36
+ # 生成二进制podspec
37
+ bin_spec = Pod::Specification.from_hash(spec)
38
+ bin_spec.description = <<-EOF
39
+ 「converted automatically by plugin cocoapods-mtxx-bin @美图 - zys」
40
+ #{bin_spec.description}
41
+ EOF
42
+ bin_spec
43
+ # puts bin_spec.to_json
44
+ end
45
+
46
+ # podspec写入文件
47
+ def write_binary_podspec(spec)
48
+ UI.info "写入podspec:#{@pod_target}".yellow
49
+ podspec_dir = "#{Pathname.pwd}/build_pods/#{@pod_target}/Products/podspec"
50
+ FileUtils.mkdir(podspec_dir) unless File.exist?(podspec_dir)
51
+ file = "#{podspec_dir}/#{@pod_target.pod_name}.podspec.json"
52
+ FileUtils.rm_rf(file) if File.exist?(file)
53
+
54
+ File.open(file, "w+") do |f|
55
+ f.write(spec.to_pretty_json)
56
+ end
57
+ file
58
+ end
59
+
60
+ # 上传二进制podspec
61
+ def push_binary_podspec(binary_podsepc_json)
62
+ UI.info "推送podspec:#{@pod_target}".yellow
63
+ return unless File.exist?(binary_podsepc_json)
64
+ repo_name = Pod::Config.instance.sources_manager.binary_source.name
65
+ # repo_name = 'example-private-spec-bin'
66
+ argvs = %W[#{repo_name} #{binary_podsepc_json} --skip-import-validation --use-libraries --allow-warnings --verbose]
67
+
68
+ begin
69
+ push = Pod::Command::Repo::Push.new(CLAide::ARGV.new(argvs))
70
+ push.validate!
71
+ push.run
72
+ rescue Pod::StandardError => e
73
+ UI.info "推送podspec:#{@pod_target} 失败,#{e.to_s}".red
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ # 删除无用的字段
80
+ def delete_unused(spec)
81
+ spec.delete('project_header_files')
82
+ spec.delete('resource_bundles')
83
+ spec.delete('exclude_files')
84
+ spec.delete('preserve_paths')
85
+ spec.delete('prepare_command')
86
+ end
87
+
88
+ # 处理subspecs
89
+ def handle_subspecs(spec)
90
+ spec['subspecs'].map do |subspec|
91
+ # 处理单个subspec
92
+ handle_single_subspec(subspec, spec)
93
+ # 递归处理subspec
94
+ recursive_handle_subspecs(subspec['subspecs'], spec)
95
+ end if spec && spec['subspecs']
96
+ end
97
+
98
+ # 递归处理subspecs
99
+ def recursive_handle_subspecs(subspecs, spec)
100
+ subspecs.map do |s|
101
+ # 处理单个subspec
102
+ handle_single_subspec(s, spec)
103
+ # 递归处理
104
+ recursive_handle_subspecs(s['subspecs'], spec)
105
+ end if subspecs
106
+ end
107
+
108
+ # 处理单个subspec
109
+ def handle_single_subspec(subspec, spec)
110
+ subspec['source_files'] = spec['source_files']
111
+ subspec['public_header_files'] = spec['public_header_files']
112
+ subspec['private_header_files'] = spec['private_header_files']
113
+ subspec['vendored_frameworks'] = spec['vendored_frameworks']
114
+ subspec['vendored_libraries'] = spec['vendored_libraries']
115
+ subspec['resources'] = spec['resources']
116
+ # 删除无用字段
117
+ delete_unused(subspec)
118
+ end
119
+
120
+ def source
121
+ # url = "http://localhost:8080/frameworks/#{@pod_target.root_spec.module_name}/#{version}/zip"
122
+ url = "#{CBin.config.binary_download_url_str}/#{@pod_target.root_spec.module_name}/#{version}/#{@pod_target.root_spec.module_name}.framework_#{version}.zip"
123
+ { http: url, type: 'zip' }
124
+ end
125
+
126
+ def version
127
+ @version || @pod_target.root_spec.version
128
+ end
129
+
130
+ # 特殊的资源后缀
131
+ def special_resource_exts
132
+ %w[momd mom cdm nib storyboardc]
133
+ end
134
+
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,81 @@
1
+ require 'json'
2
+
3
+ module CBin
4
+ module BuildAll
5
+ class ZipFileHelper
6
+ include Pod
7
+
8
+ def initialize(pod_target, version, product_dir, build_as_framework = false)
9
+ @pod_target = pod_target
10
+ @version = version
11
+ @product_dir = product_dir
12
+ @build_as_framework = build_as_framework
13
+ end
14
+
15
+ # 上传静态库
16
+ def upload_zip_lib
17
+ Dir.chdir(@product_dir) do
18
+ zip_file = File.join(Dir.pwd, "#{zip_file_name}")
19
+ unless File.exist?(zip_file)
20
+ UI.info "#{Dir.pwd}目录下无 #{zip_file_name} 文件".red
21
+ return false
22
+ end
23
+ UI.info "Uploading binary zip file #{@pod_target.root_spec.name} (#{@version || @pod_target.root_spec.version})".yellow do
24
+ upload_url = CBin.config.binary_upload_url_str
25
+ # upload_url = "http://localhost:8080/frameworks"
26
+ command = "curl -F \"name=#{@pod_target.product_module_name}\" -F \"version=#{@version || @pod_target.root_spec.version}\" -F \"file=@#{zip_file}\" #{upload_url}"
27
+ UI.info "#{command}"
28
+ json = `#{command}`
29
+ UI.info json
30
+ begin
31
+ error_code = JSON.parse(json)["error_code"]
32
+ if error_code == 0
33
+ Pod::UI.info "#{@pod_target.root_spec.name} (#{@pod_target.root_spec.version}) 上传成功".green
34
+ return true
35
+ else
36
+ Pod::UI.info "#{@pod_target.root_spec.name} (#{@pod_target.root_spec.version}) 上传失败".red
37
+ return false
38
+ end
39
+ rescue JSON::ParserError => e
40
+ Pod::UI.info "#{@pod_target.root_spec.name} (#{@pod_target.root_spec.version}) 上传失败".red
41
+ Pod::UI.info "#{e.to_s}".red
42
+ return false
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ # 压缩静态库
49
+ def zip_lib
50
+ Dir.chdir(@product_dir) do
51
+ input_library = "#{@pod_target.framework_name}"
52
+ output_library = File.join(Dir.pwd, zip_file_name)
53
+ FileUtils.rm_f(output_library) if File.exist?(output_library)
54
+ unless File.exist?(input_library)
55
+ UI.info "没有需要压缩的二进制文件:#{input_library}".red
56
+ return false
57
+ end
58
+
59
+ UI.info "Compressing #{input_library} into #{zip_file_name}".yellow do
60
+ command = "zip --symlinks -r #{output_library} #{input_library}"
61
+ UI.info "#{command}"
62
+ `#{command}`
63
+ unless File.exist?(output_library)
64
+ UI.info "压缩 #{output_library} 失败".red
65
+ return false
66
+ end
67
+ return true
68
+ end
69
+ end
70
+ end
71
+
72
+ # zip文件名字
73
+ def zip_file_name
74
+ @zip_file_name ||= begin
75
+ "#{@pod_target.framework_name}_#{@version || @pod_target.root_spec.version}.zip"
76
+ end
77
+ end
78
+
79
+ end
80
+ end
81
+ end
@@ -57,9 +57,13 @@ module Pod
57
57
  :release => Set.new,
58
58
  }
59
59
 
60
+ podfile = Pod::Config.instance.podfile
61
+
60
62
  if !specs.empty? && !all_specs.empty?
61
63
  specs.each do |s|
62
64
  s.dependencies(platform).each do |dep|
65
+ # use_binary = podfile.use_binaries? && !podfile.use_source_pods.include?(dep.root_name)
66
+ # key = use_binary ? dep.root_name : dep.name
63
67
  all_specs[dep.name].each do |spec|
64
68
  if spec.non_library_specification?
65
69
  if s.test_specification? && spec.name == s.consumer(platform).app_host_name && spec.app_specification?