cocoapods-imy-bin 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +541 -0
  4. data/lib/cocoapods-imy-bin.rb +2 -0
  5. data/lib/cocoapods-imy-bin/command.rb +2 -0
  6. data/lib/cocoapods-imy-bin/command/bin.rb +60 -0
  7. data/lib/cocoapods-imy-bin/command/bin/archive.rb +184 -0
  8. data/lib/cocoapods-imy-bin/command/bin/auto.rb +188 -0
  9. data/lib/cocoapods-imy-bin/command/bin/code.rb +237 -0
  10. data/lib/cocoapods-imy-bin/command/bin/imy.rb +46 -0
  11. data/lib/cocoapods-imy-bin/command/bin/init.rb +69 -0
  12. data/lib/cocoapods-imy-bin/command/bin/initHotKey.rb +70 -0
  13. data/lib/cocoapods-imy-bin/command/bin/install.rb +44 -0
  14. data/lib/cocoapods-imy-bin/command/bin/lib/lint.rb +69 -0
  15. data/lib/cocoapods-imy-bin/command/bin/local.rb +156 -0
  16. data/lib/cocoapods-imy-bin/command/bin/repo/update.rb +43 -0
  17. data/lib/cocoapods-imy-bin/command/bin/spec/create.rb +73 -0
  18. data/lib/cocoapods-imy-bin/command/bin/spec/push.rb +114 -0
  19. data/lib/cocoapods-imy-bin/command/bin/update.rb +148 -0
  20. data/lib/cocoapods-imy-bin/config/config.rb +137 -0
  21. data/lib/cocoapods-imy-bin/config/config_asker.rb +57 -0
  22. data/lib/cocoapods-imy-bin/config/config_builder.rb +179 -0
  23. data/lib/cocoapods-imy-bin/config/config_hot_key.rb +103 -0
  24. data/lib/cocoapods-imy-bin/config/config_hot_key_asker.rb +57 -0
  25. data/lib/cocoapods-imy-bin/gem_version.rb +10 -0
  26. data/lib/cocoapods-imy-bin/helpers.rb +4 -0
  27. data/lib/cocoapods-imy-bin/helpers/build_helper.rb +150 -0
  28. data/lib/cocoapods-imy-bin/helpers/framework.rb +62 -0
  29. data/lib/cocoapods-imy-bin/helpers/framework_builder.rb +307 -0
  30. data/lib/cocoapods-imy-bin/helpers/library.rb +54 -0
  31. data/lib/cocoapods-imy-bin/helpers/library_builder.rb +90 -0
  32. data/lib/cocoapods-imy-bin/helpers/local/loca_llibrary.rb +57 -0
  33. data/lib/cocoapods-imy-bin/helpers/local/local_build_helper.rb +146 -0
  34. data/lib/cocoapods-imy-bin/helpers/local/local_framework.rb +65 -0
  35. data/lib/cocoapods-imy-bin/helpers/local/local_framework_builder.rb +174 -0
  36. data/lib/cocoapods-imy-bin/helpers/local/local_library_builder.rb +92 -0
  37. data/lib/cocoapods-imy-bin/helpers/sources_helper.rb +33 -0
  38. data/lib/cocoapods-imy-bin/helpers/spec_creator.rb +170 -0
  39. data/lib/cocoapods-imy-bin/helpers/spec_files_helper.rb +77 -0
  40. data/lib/cocoapods-imy-bin/helpers/spec_source_creator.rb +171 -0
  41. data/lib/cocoapods-imy-bin/helpers/upload_helper.rb +84 -0
  42. data/lib/cocoapods-imy-bin/native.rb +19 -0
  43. data/lib/cocoapods-imy-bin/native/acknowledgements.rb +27 -0
  44. data/lib/cocoapods-imy-bin/native/analyzer.rb +53 -0
  45. data/lib/cocoapods-imy-bin/native/installation_options.rb +25 -0
  46. data/lib/cocoapods-imy-bin/native/installer.rb +115 -0
  47. data/lib/cocoapods-imy-bin/native/linter.rb +26 -0
  48. data/lib/cocoapods-imy-bin/native/path_source.rb +33 -0
  49. data/lib/cocoapods-imy-bin/native/pod_source_installer.rb +19 -0
  50. data/lib/cocoapods-imy-bin/native/podfile.rb +91 -0
  51. data/lib/cocoapods-imy-bin/native/podfile_env.rb +37 -0
  52. data/lib/cocoapods-imy-bin/native/podfile_generator.rb +190 -0
  53. data/lib/cocoapods-imy-bin/native/podspec_finder.rb +25 -0
  54. data/lib/cocoapods-imy-bin/native/resolver.rb +230 -0
  55. data/lib/cocoapods-imy-bin/native/sandbox_analyzer.rb +34 -0
  56. data/lib/cocoapods-imy-bin/native/source.rb +35 -0
  57. data/lib/cocoapods-imy-bin/native/sources_manager.rb +20 -0
  58. data/lib/cocoapods-imy-bin/native/specification.rb +31 -0
  59. data/lib/cocoapods-imy-bin/native/validator.rb +77 -0
  60. data/lib/cocoapods-imy-bin/source_provider_hook.rb +54 -0
  61. data/lib/cocoapods_plugin.rb +3 -0
  62. data/spec/command/bin_spec.rb +12 -0
  63. data/spec/spec_helper.rb +50 -0
  64. metadata +180 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c99d4590c1c6004926364bb52d7f91440241f103
4
+ data.tar.gz: f3de8526a052828003e5d2eb797e474c21decc5d
5
+ SHA512:
6
+ metadata.gz: fb547402fa37dea290961ca3c28c2706362e8ffb0dc8d17c2de4ce7ea8ca6242a501a1c8d6eb6985581e6d8d86be975e184dc9c916d991b8809e347bf268915a
7
+ data.tar.gz: 6db6b055aa0d2c238cca049f33e19b2143db2e33c445995d35b22fa0f073f86e1180f0a312f20ce9f96b30151a06794fb84a6405980f88ee21af0e3d36bf0a7f
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2018 tripleCC <triplec.linux@gmail.com>
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,541 @@
1
+ # cocoapods-bin
2
+
3
+ 组件二进制化插件。
4
+
5
+ [基于 CocoaPods 的组件二进制化实践](https://triplecc.github.io/2019/01/21/%E5%9F%BA%E4%BA%8ECocoaPods%E7%9A%84%E7%BB%84%E4%BB%B6%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8C%96%E5%AE%9E%E8%B7%B5/)
6
+
7
+ [Demo 工程](https://github.com/for-example-test/cocoapods-bin-example)
8
+
9
+ ## 更新
10
+
11
+ #### 0.1.28
12
+
13
+ 新增本地组件依赖配置文件 BinPodfile ,
14
+
15
+ 场景: 不希望把本地采用的源码/二进制配置传到远程仓库。
16
+
17
+ 使用: 在 Podfile 同级目录下创建 BinPodfile ,并将其加入 .gitignore 。BinPodfile 中的配置选项优先级比 Podfile 高,支持和 Podfile 相同的配置语句,如 :
18
+
19
+ ```ruby
20
+ # BinPodfile
21
+
22
+ use_binaries!
23
+ set_use_source_pods ['YYModel']
24
+
25
+ ```
26
+
27
+
28
+ ## 概要
29
+
30
+ 本插件所关联的组件二进制化策略:
31
+
32
+ 预先将打包成 `.a` 或者 `.framework` 的组件(目前接入此插件必须使用 `.framework`,最好是静态 framework)保存到静态服务器上,并在 `install` 时,去下载组件对应的二进制版本,以减少组件编译时间,达到加快 App 打包、组件 lint、组件发布等操作的目的。
33
+
34
+ 使用本插件需要提供以下资源:
35
+
36
+ - 静态资源服务器(可参考 [binary-server](https://github.com/tripleCC/binary-server.git))
37
+ - 源码私有源(保存组件源码版本 podspec)
38
+ - 二进制私有源(保存组件二进制版本 podspec)
39
+
40
+ 在所有组件都依赖二进制版本的情况下,本插件支持切换指定组件的依赖版本。
41
+
42
+ 推荐结合 GitLab CI 使用本插件,可以实现自动打包发布,并显著减少其 pipeline 耗时。关于 GitLab CI 的实践,可以参考 [火掌柜 iOS 团队 GitLab CI 集成实践](https://triplecc.github.io/2018/06/23/2018-06-23-ji-gitlabcide-ci-shi-jian/)。虽然后来对部分 stage 和脚本都进行了优化,但总体构建思路还是没变的。
43
+
44
+ ## 准备工作
45
+
46
+ 安装 `cocoapods-bin`:
47
+
48
+ $ gem install cocoapods-bin
49
+
50
+ 初始化插件:
51
+
52
+ ```shell
53
+ ➜ ~ pod bin init
54
+
55
+ 开始设置二进制化初始信息.
56
+ 所有的信息都会保存在 /Users/songruiwang/.cocoapods/bin.yml 文件中.
57
+ 你可以在对应目录下手动添加编辑该文件. 文件包含的配置信息样式如下:
58
+
59
+ ---
60
+ code_repo_url: git@git.xxxxxx.net:ios/cocoapods-spec.git
61
+ binary_repo_url: git@git.xxxxxx.net:ios/cocoapods-spec-binary.git
62
+ binary_download_url: http://iosframeworkserver-shopkeeperclient.app.2dfire.com/download/%s/%s.zip
63
+ download_file_type: zip
64
+
65
+
66
+ 源码私有源 Git 地址
67
+ 旧值:git@git.xxxxxx.net:ios/cocoapods-spec.git
68
+ >
69
+ ```
70
+
71
+ 按提示输入源码私有源、二进制私有源、二进制下载地址、下载文件类型后,插件就配置完成了。其中 `binary_download_url` 需要预留组件名称与组件版本占位符,插件内部会依次替换 `%s` 为相应组件的值。
72
+
73
+ `cococapod-bin` 也支持从 url 下载配置文件,方便对多台机器进行配置:
74
+
75
+ ```shell
76
+ ➜ ~ pod bin init --bin-url=http://git.xxxxxx.net/qingmu/cocoapods-tdfire-binary-config/raw/master/bin.yml
77
+ ```
78
+
79
+ 配置文件模版内容如下,根据不同团队的需求定制即可:
80
+
81
+ ```yaml
82
+ ---
83
+ code_repo_url: git@git.xxxxxx.net:ios/cocoapods-spec.git
84
+ binary_repo_url: git@git.xxxxxx.net:ios/cocoapods-spec-binary.git
85
+ binary_download_url: http://iosframeworkserver-shopkeeperclient.app.2dfire.com/download/%s/%s.zip
86
+ download_file_type: zip
87
+ ```
88
+
89
+ 配置时,不需要手动添加源码和二进制私有源的 repo,插件在找不到对应 repo 时会主动 clone。
90
+
91
+ 插件配置完后,就可以部署静态资源服务器了。对于静态资源服务器,这里不做赘述,只提示一点:在生成二进制 podspec 时,插件会根据 `download_file_type` 设置 source 的 `:type` 字段。在下载 http/https 资源时,CocoaPods 会根据 `:type` 字段的类型采取相应的解压方式,如果设置错误就会抛错。这里提到了 **二进制 podspec 的自动生成**,后面会详细介绍。
92
+
93
+ 这里额外说下打包工具 [cocoapods-packager](https://github.com/CocoaPods/cocoapods-packager) 和 [Carthage](https://github.com/Carthage/Carthage/issues) ,前者可以通过 podspec 进行打包,只要保证 lint 通过了,就可以打成 `.framework`,很方便,但是作者几乎不维护了,后者需要结合组件工程。具体使用哪个可以结合自身团队,甚至可以自己写打包脚本,或者使用本插件的打包命令。
94
+
95
+ ## 使用插件
96
+
97
+ 接入二进制版本后,常规的发布流程需要做如下变更:
98
+
99
+ ```shell
100
+ # 1 打出二进制产物 && 提交产物至静态文件服务器
101
+ pod bin archive YOUR_OPTIONS
102
+ curl xxxxxxx
103
+
104
+ # 2.1 发布二进制 podspec
105
+ pod bin repo push --binary YOUR_OPTIONS
106
+
107
+ # 2.2 发布源码 podspec
108
+ pod bin repo push YOUR_OPTIONS
109
+ ```
110
+
111
+ 如果团队内部集成了 CI 平台,那么上面的每大步都可以对应一个 CI stage,源码和二进制版本可并行发布,对应一个 stage 中的两个 job。
112
+
113
+ ### 基本信息
114
+
115
+ `cocoapods-bin` 命令行信息可以输入以下命令查看:
116
+
117
+ ```shell
118
+ ➜ ~ pod bin --help
119
+ Usage:
120
+
121
+ $ pod bin [COMMAND]
122
+
123
+ 组件二进制化插件。利用源码私有源与二进制私有源实现对组件依赖类型的切换。
124
+
125
+ Commands:
126
+ + archive 将组件归档为静态 framework.
127
+ + init 初始化插件.
128
+ + lib 管理二进制 pod.
129
+ + list 展示二进制 pods .
130
+ > open 打开 workspace 工程.
131
+ + repo 管理 spec 仓库.
132
+ + search 查找二进制 spec.
133
+ + spec 管理二进制 spec.
134
+ + umbrella 生成伞头文件 .
135
+ ```
136
+
137
+ ### 构建二进制产物
138
+
139
+ ```shell
140
+ ➜ ~ pod bin archive --help
141
+ Usage:
142
+
143
+ $ pod bin archive [NAME.podspec]
144
+
145
+ 将组件归档为静态 framework,仅支持 iOS 平台 此静态 framework 不包含依赖组件的 symbol
146
+
147
+ Options:
148
+
149
+ --code-dependencies 使用源码依赖
150
+ --allow-prerelease 允许使用 prerelease 的版本
151
+ --use-modular-headers 使用 modular headers (modulemap)
152
+ --no-clean 保留构建中间产物
153
+ --no-zip 不压缩静态 framework 为 zip
154
+ ...
155
+ ```
156
+
157
+ `pod bin archive` 会根据 podspec 文件构建静态 framework ,此静态 framework 不会包含依赖组件的符号信息。命令内部利用 [cocoapods-generate](https://github.com/square/cocoapods-generate) 插件生成工程,并移植了 [cocoapods-packager](https://github.com/CocoaPods/cocoapods-packager) 插件的部分打包功能,以构建前者生成的工程,默认条件下,命令会生成一个 zip 压缩包。
158
+
159
+ ### 二进制 podspec
160
+
161
+ `cocoapods-bin` 针对一个组件,同时使用了两种 podspec,分别为源码 podspec 和二进制 podspec,这种方式在没有工具支撑的情况下,势必会增加开发者维护组件的工作量。做为开发者来说,我是不希望同时维护两套 podspec 的。为了解决这个问题, 插件提供了自动生成二进制 podspec 功能,开发者依旧只需要关心源码 podspec 即可。
162
+
163
+ 一般来说,在接入插件前,组件源码 podspec 是已经存在的,所以我们只需要向二进制私有源推送组件的二进制 podspec 即可。如果有条件的话,二进制和源码 podspec 的发布可以走 GitLab CI ,这也是我推荐的做法。
164
+
165
+ 下面介绍下和二进制 podspec 相关的 `cocoapods-bin` 命令。
166
+
167
+ #### pod bin spec create
168
+
169
+ ```shell
170
+ ➜ ~ pod bin spec create --help
171
+ Usage:
172
+
173
+ $ pod bin spec create
174
+
175
+ 根据源码 podspec 文件,创建对应的二进制 podspec 文件.
176
+
177
+ Options:
178
+
179
+ --platforms=ios 生成二进制 spec 支持的平台
180
+ --template-podspec=A.binary-template.podspec 生成拥有 subspec 的二进制 spec 需要的模版
181
+ podspec, 插件会更改 version 和 source
182
+ --no-overwrite 不允许覆盖
183
+ ...
184
+ ```
185
+
186
+ `pod bin spec create` 会根据源码 podspec ,创建出二进制 podspec 文件。如果组件存在 subspec ,需要开发者提供 podspec 模版信息,以生成二进制 podspec。插件会根据源码 podspec 更改模版中的 version 字段,并且根据插件配置的 `binary_download_url` 生成 source 字段,最终生成二进制 podspec。
187
+
188
+ 以 A 组件举例,如果 A 的 podspec 如下:
189
+
190
+ ```ruby
191
+ Pod::Spec.new do |s|
192
+ s.name = 'A'
193
+ s.version = '0.1.0'
194
+ s.summary = 'business A short description of A.'
195
+ s.description = <<-DESC
196
+ TODO: Add long description of the pod here.
197
+ DESC
198
+ s.homepage = 'http://git.2dfire-inc.com/ios/A'
199
+ s.license = { :type => 'MIT', :file => 'LICENSE' }
200
+ s.author = { 'qingmu' => 'qingmu@2dfire.com' }
201
+ s.source = { :git => 'http://git.2dfire-inc.com/qiandaojiang/A.git', :tag => s.version.to_s }
202
+ s.ios.deployment_target = '8.0'
203
+ s.source_files = 'A/Classes/**/*'
204
+ s.public_header_files = 'A/Classes/**/*.{h}'
205
+ s.resource_bundles = {
206
+ 'A' => ['A/Assets/*']
207
+ }
208
+ end
209
+ ```
210
+
211
+ 那么生成的 `A.binary.podspec.json` 如下:
212
+
213
+ ```json
214
+ {
215
+ "name": "A",
216
+ "version": "0.1.0",
217
+ "summary": "business A short description of A.",
218
+ "description": "TODO: Add long description of the pod here.",
219
+ "homepage": "http://git.2dfire-inc.com/ios/A",
220
+ "license": {
221
+ "type": "MIT",
222
+ "file": "LICENSE"
223
+ },
224
+ "authors": {
225
+ "qingmu": "qingmu@2dfire.com"
226
+ },
227
+ "source": {
228
+ "http": "http://iosframeworkserver-shopkeeperclient.app.2dfire.com/download/A/0.1.0.zip",
229
+ "type": "zip"
230
+ },
231
+ "platforms": {
232
+ "ios": "8.0"
233
+ },
234
+ "source_files": [
235
+ "A.framework/Headers/*",
236
+ "A.framework/Versions/A/Headers/*"
237
+ ],
238
+ "public_header_files": [
239
+ "A.framework/Headers/*",
240
+ "A.framework/Versions/A/Headers/*"
241
+ ],
242
+ "vendored_frameworks": "A.framework",
243
+ "resources": [
244
+ "A.framework/Resources/*.bundle",
245
+ "A.framework/Versions/A/Resources/*.bundle"
246
+ ]
247
+ }
248
+ ```
249
+
250
+ 如果 A 拥有 subspec:
251
+
252
+ ```ruby
253
+ Pod::Spec.new do |s|
254
+ s.name = 'A'
255
+ s.version = '0.1.0'
256
+ s.summary = 'business A short description of A.'
257
+ s.description = <<-DESC
258
+ TODO: Add long description of the pod here.
259
+ DESC
260
+ s.homepage = 'http://git.2dfire-inc.com/ios/A'
261
+ s.license = { :type => 'MIT', :file => 'LICENSE' }
262
+ s.author = { 'qingmu' => 'qingmu@2dfire.com' }
263
+ s.source = { :git => 'http://git.2dfire-inc.com/qiandaojiang/A.git', :tag => s.version.to_s }
264
+ s.ios.deployment_target = '8.0'
265
+ s.source_files = 'A/Classes/**/*'
266
+ s.public_header_files = 'A/Classes/**/*.{h}'
267
+ s.resource_bundles = {
268
+ 'A' => ['A/Assets/*']
269
+ }
270
+ s.subspec 'B' do |ss|
271
+ ss.dependency 'YYModel'
272
+ ss.source_files = 'A/Classes/**/*'
273
+ end
274
+ end
275
+
276
+ ```
277
+
278
+ 那么就需要开发者提供 `A.binary-template.podspec`(此模版中的写法假定组件的所有 subspec 都打进一个 `.framework` 里,如果 subpsec 都有属于自己的 `.framework` ,就可以采用其他写法。),**这里要注意源码版本 subspec 集合需要为二进制版本 subspec 集合的子集,否则会出现源码拉取失败或抛出 subspec 不存在错误的情况**:
279
+
280
+ ```ruby
281
+ Pod::Spec.new do |s|
282
+ s.name = 'A'
283
+ s.summary = 'business A short description of A.'
284
+ s.description = <<-DESC
285
+ TODO: Add long description of the pod here.
286
+ DESC
287
+ s.homepage = 'http://git.2dfire-inc.com/ios/A'
288
+ s.license = { :type => 'MIT', :file => 'LICENSE' }
289
+ s.author = { 'qingmu' => 'qingmu@2dfire.com' }
290
+ s.ios.deployment_target = '8.0'
291
+
292
+ s.subspec "Binary" do |ss|
293
+ ss.vendored_frameworks = "#{s.name}.framework"
294
+ ss.source_files = "#{s.name}.framework/Headers/*", "#{s.name}.framework/Versions/A/Headers/*"
295
+ ss.public_header_files = "#{s.name}.framework/Headers/*", "#{s.name}.framework/Versions/A/Headers/*"
296
+ # 结合实际打包后的资源产出文件类型编写
297
+ ss.resources = "#{s.name}.framework/Resources/*.{bundle}", "#{s.name}.framework/Versions/A/Resources/*.{bundle}"
298
+ ss.dependency 'YYModel'
299
+ end
300
+
301
+ s.subspec 'B' do |ss|
302
+ ss.dependency "#{s.name}/Binary"
303
+ end
304
+ end
305
+
306
+ ```
307
+
308
+ 最终生成的二进制 podspec 如下:
309
+
310
+ ```json
311
+ {
312
+ "name": "A",
313
+ "summary": "business A short description of A.",
314
+ "description": "TODO: Add long description of the pod here.",
315
+ "homepage": "http://git.2dfire-inc.com/ios/A",
316
+ "license": {
317
+ "type": "MIT",
318
+ "file": "LICENSE"
319
+ },
320
+ "authors": {
321
+ "qingmu": "qingmu@2dfire.com"
322
+ },
323
+ "platforms": {
324
+ "ios": "8.0"
325
+ },
326
+ "version": "0.1.0",
327
+ "source": {
328
+ "http": "http://iosframeworkserver-shopkeeperclient.app.2dfire.com/download/A/0.1.0.zip",
329
+ "type": "zip"
330
+ },
331
+ "subspecs": [
332
+ {
333
+ "name": "Binary",
334
+ "vendored_frameworks": "A.framework",
335
+ "source_files": [
336
+ "A.framework/Headers/*",
337
+ "A.framework/Versions/A/Headers/*"
338
+ ],
339
+ "public_header_files": [
340
+ "A.framework/Headers/*",
341
+ "A.framework/Versions/A/Headers/*"
342
+ ],
343
+ "resources": [
344
+ "A.framework/Resources/*.{bundle}",
345
+ "A.framework/Versions/A/Resources/*.{bundle}"
346
+ ],
347
+ "dependencies": {
348
+ "YYModel": [
349
+
350
+ ]
351
+ }
352
+ },
353
+ {
354
+ "name": "B",
355
+ "dependencies": {
356
+ "A/Binary": [
357
+
358
+ ]
359
+ }
360
+ }
361
+ ]
362
+ }
363
+ ```
364
+
365
+ #### pod bin spec lint
366
+
367
+ ```shell
368
+ ➜ ~ pod bin spec lint --help
369
+ Usage:
370
+
371
+ $ pod bin spec lint [NAME.podspec|DIRECTORY|http://PATH/NAME.podspec ...]
372
+
373
+ spec lint 二进制组件 / 源码组件
374
+
375
+ Options:
376
+
377
+ --binary lint 组件的二进制版本
378
+ --template-podspec=A.binary-template.podspec 生成拥有 subspec 的二进制 spec 需要的模版
379
+ podspec, 插件会更改 version 和 source
380
+ --reserve-created-spec 保留生成的二进制 spec 文件
381
+ --code-dependencies 使用源码依赖进行 lint
382
+ --loose-options 添加宽松的 options, 包括 --use-libraries
383
+ (可能会造成 entry point (start)
384
+ undefined)
385
+ ...
386
+ ```
387
+
388
+ `pod bin spec lint` 默认使用二进制依赖进行 lint,在添加 `--binary` 会去 lint 当前组件的二进制 podspec(动态生成)。在添加 `--code-dependencies` 将会使用源码依赖进行 lint ,个人推荐使用二进制依赖 lint,可以极大地减少编译时间。
389
+
390
+ #### pod bin repo push
391
+
392
+ ```shell
393
+
394
+ ➜ ~ pod bin repo push --help
395
+ Usage:
396
+
397
+ $ pod bin repo push [NAME.podspec]
398
+
399
+ 发布二进制组件 / 源码组件
400
+
401
+ Options:
402
+
403
+ --binary 发布组件的二进制版本
404
+ --template-podspec=A.binary-template.podspec 生成拥有 subspec 的二进制 spec 需要的模版
405
+ podspec, 插件会更改 version 和 source
406
+ --reserve-created-spec 保留生成的二进制 spec 文件
407
+ --code-dependencies 使用源码依赖进行 lint
408
+ --loose-options 添加宽松的 options, 包括
409
+ --use-libraries (可能会造成 entry
410
+ point (start) undefined)
411
+ ...
412
+ ```
413
+
414
+ `pod bin repo push` 用来发布组件,其余特性和 `pod bin spec lint` 一致。
415
+
416
+ ### Podfile DSL
417
+
418
+ 首先,开发者需要在 Podfile 中需要使用 `plugin 'cocoapods-bin'` 语句引入插件 :
419
+
420
+ ```ruby
421
+ plugin 'cocoapods-bin'
422
+ ```
423
+
424
+ 顺带可以删除 Podfile 中的 source ,因为插件内部会自动帮你添加两个私有源。
425
+
426
+ `cocoapods-bin `插件提供二进制相关的配置语句有 `use_binaries!`、`use_binaries_with_spec_selector!` 以及 `set_use_source_pods`,下面会分别介绍。
427
+
428
+ #### use_binaries!
429
+
430
+ 全部组件使用二进制版本。
431
+
432
+ 支持传入布尔值控制是否使用二进制版本,比如 DEBUG 包使用二进制版本,正式包使用源码版本,Podfile 关联语句可以这样写:
433
+
434
+ ```ruby
435
+ use_binaries! (ENV['DEBUG'].nil? || ENV['DEBUG'] == 'true')
436
+ ```
437
+
438
+ 当组件没有二进制版本时,插件会强制工程依赖该组件的源码版本。开发者可以通过执行 `pod install--verbose` option ,在分析依赖步骤查看哪些组件没有二进制版本:
439
+
440
+ ```shell
441
+ ...
442
+ Resolving dependencies of `Podfile`
443
+ 【AMapFrameworks | 0.0.4】组件无对应二进制版本 , 将采用源码依赖.
444
+ 【ActivityForRestApp | 0.2.1】组件无对应二进制版本 , 将采用源码依赖.
445
+ 【AssemblyComponent | 0.5.9】组件无对应二进制版本 , 将采用源码依赖.
446
+ 【Bugly | 2.4.6】组件无对应二进制版本 , 将采用源码依赖.
447
+ 【Celebi | 0.6.4】组件无对应二进制版本 , 将采用源码依赖.
448
+ 【CocoaAsyncSocket/RunLoop | 7.4.3】组件无对应二进制版本 , 将采用源码依赖.
449
+ 【CocoaLumberjack | 3.4.1】组件无对应二进制版本 , 将采用源码依赖.
450
+ 【CocoaLumberjack/Default | 3.4.1】组件无对应二进制版本 , 将采用源码依赖.
451
+ 【CocoaLumberjack/Extensions | 3.4.1】组件无对应二进制版本 , 将采用源码依赖.
452
+ 【CodePush | 0.3.1】组件无对应二进制版本 , 将采用源码依赖.
453
+ 【CodePush/Core | 0.3.1】组件无对应二进制版本 , 将采用源码依赖.
454
+ 【CodePush/SSZipArchive | 0.3.1】组件无对应二进制版本 , 将采用源码依赖.
455
+ 【ESExchangeSkin | 0.3.2】组件无对应二进制版本 , 将采用源码依赖.
456
+ ...
457
+ ```
458
+
459
+ 也可以通过 Podfile.lock 中的 `SPEC REPOS` 字段,查看哪些组件采用了源码版本,哪些采用了二进制版本:
460
+
461
+ ```yaml
462
+ ...
463
+ SPEC REPOS:
464
+ "git@git.xxxxxx.net:ios/cocoapods-spec-binary.git":
465
+ - AFNetworking
466
+ - Aspects
467
+ - CocoaSecurity
468
+ - DACircularProgress
469
+ ...
470
+ "git@git.xxxxxx.net:ios/cocoapods-spec.git":
471
+ - ActivityForRestApp
472
+ - AMapFrameworks
473
+ - AssemblyComponent
474
+ ...
475
+ ...
476
+ ```
477
+
478
+
479
+ #### set_use_source_pods
480
+
481
+ 设置使用源码版本的组件。
482
+
483
+ 实际开发中,可能需要查看 YYModel 组件的源码,这时候可以这么设置:
484
+
485
+ ```ruby
486
+ set_use_source_pods ['YYModel']
487
+ ```
488
+
489
+ 如果 CocoaPods 版本为 1.5.3 ,终端会输出以下内容,表示 YYModel 的参照源从二进制私有源切换到了源码私有源:
490
+
491
+ ```shell
492
+ Analyzing dependencies
493
+ Fetching podspec for `A` from `../`
494
+ Downloading dependencies
495
+ Using A (0.1.0)
496
+ Installing YYModel 1.0.4.2 (source changed to `git@git.xxxxxx.net:ios/cocoapods-spec.git` from `git@git.xxxxxx.net:ios/cocoapods-spec-binary.git`)
497
+ Generating Pods project
498
+ Integrating client project
499
+ Sending stats
500
+ Pod installation complete! There is 1 dependency from the Podfile and 2 total pods installed.
501
+ ```
502
+
503
+ #### use_binaries_with_spec_selector!
504
+
505
+ 过滤出需要使用二进制版本组件。
506
+
507
+ 假如开发者只需要 `YYModel` 的二进制版本,那么他可以在 Podfile 中添加以下代码:
508
+
509
+ ```ruby
510
+ use_binaries_with_spec_selector! do |spec|
511
+ spec.name == 'YYModel'
512
+ end
513
+ ```
514
+
515
+ **需要注意的是,如果组件有 subspec ,使用组件名作为判断条件应如下**:
516
+
517
+ ```ruby
518
+ use_binaries_with_spec_selector! do |spec|
519
+ spec.name.start_with? == '组件名'
520
+ end
521
+ ```
522
+
523
+ 如果像上个代码块一样,**直接对比组件名,则插件会忽略此组件的所有 subspec,导致资源拉取错误**,这种场景下,最好通过 `set_use_source_pods` 语句配置依赖。
524
+
525
+ 一个实际应用是,三方组件采用二进制版本,团队编写的组件依旧采用源码版本。如果三方组件都在 `cocoapods-repo` 组下,就可以使用以下代码过滤出三方组件:
526
+
527
+ ```ruby
528
+ use_binaries_with_spec_selector! do |spec|
529
+ git = spec.source && spec.source['git']
530
+ git && git.include?('cocoapods-repo')
531
+ end
532
+ ```
533
+
534
+ #### 其他设置
535
+
536
+ 插件默认开启多线程下载组件资源,如果要禁用这个功能,Podfile 添加以下代码即可:
537
+
538
+ ```ruby
539
+ install! 'cocoapods', { install_with_multi_threads: false }
540
+ ```
541
+