cocoapods-imy-bin 0.2.5 → 0.2.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +0 -540
- data/lib/cocoapods-imy-bin/command/bin/archive.rb +11 -3
- data/lib/cocoapods-imy-bin/command/bin/auto.rb +5 -1
- data/lib/cocoapods-imy-bin/command/bin/code.rb +1 -6
- data/lib/cocoapods-imy-bin/config/config.rb +1 -1
- data/lib/cocoapods-imy-bin/gem_version.rb +1 -1
- data/lib/cocoapods-imy-bin/helpers/build_helper.rb +1 -1
- data/lib/cocoapods-imy-bin/helpers/framework_builder.rb +162 -126
- data/lib/cocoapods-imy-bin/helpers/library.rb +2 -2
- data/lib/cocoapods-imy-bin/helpers/sources_helper.rb +5 -2
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3a3377899dc43c94174edb34413bbe594ebb627cd546be4f5f674c7e5ba05823
|
4
|
+
data.tar.gz: 5882f4bf7c103765b78de5317e3d2491924560c412c99aad23e4d4b88aefa6ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd411bf63e780b416f78dde353e73a5c06c779e10a4ae8e9aa05e35849924c5371ead354131b2e9f47d49ef200f274ee9680b0d2b52e481789b853eaf764c439
|
7
|
+
data.tar.gz: beb2d0a9eea8b96ca09d052fc72842000e1ec86040685f994b4748a1c69e2184d28e286d0fd54544c333d0fbb9a6515df4324084075d3eea87a2056662738698
|
data/README.md
CHANGED
@@ -1,541 +1 @@
|
|
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
1
|
|
@@ -29,6 +29,7 @@ module Pod
|
|
29
29
|
['--sources', '私有源地址,多个用分号区分'],
|
30
30
|
['--framework-output', '输出framework文件'],
|
31
31
|
['--no-zip', '不压缩静态库 为 zip'],
|
32
|
+
['--configuration', 'Build the specified configuration (e.g. Debug). Defaults to Release'],
|
32
33
|
['--env', "该组件上传的环境 %w[dev debug_iphoneos release_iphoneos]"]
|
33
34
|
].concat(Pod::Command::Gen.options).concat(super).uniq
|
34
35
|
end
|
@@ -51,6 +52,8 @@ module Pod
|
|
51
52
|
@sources = argv.option('sources') || []
|
52
53
|
@platform = Platform.new(:ios)
|
53
54
|
|
55
|
+
@config = argv.option('configuration', 'Release')
|
56
|
+
|
54
57
|
@framework_path
|
55
58
|
super
|
56
59
|
|
@@ -81,7 +84,8 @@ module Pod
|
|
81
84
|
@framework_output,
|
82
85
|
@zip,
|
83
86
|
@spec,
|
84
|
-
CBin::Config::Builder.instance.white_pod_list.include?(@spec.name)
|
87
|
+
CBin::Config::Builder.instance.white_pod_list.include?(@spec.name),
|
88
|
+
@config)
|
85
89
|
builder.build
|
86
90
|
builder.clean_workspace if @clean && !@all_make
|
87
91
|
end
|
@@ -119,9 +123,12 @@ module Pod
|
|
119
123
|
@platform,
|
120
124
|
@framework_output,
|
121
125
|
@zip,
|
122
|
-
@spec
|
126
|
+
@spec,
|
127
|
+
false ,
|
128
|
+
@config)
|
123
129
|
builder.build
|
124
|
-
rescue
|
130
|
+
rescue Object => exception
|
131
|
+
UI.puts exception
|
125
132
|
fail_build_specs << spec
|
126
133
|
end
|
127
134
|
end
|
@@ -148,6 +155,7 @@ module Pod
|
|
148
155
|
"--sources=#{sources_option(@code_dependencies, @sources)}",
|
149
156
|
"--gen-directory=#{CBin::Config::Builder.instance.gen_dir}",
|
150
157
|
'--clean',
|
158
|
+
'--use-podfile',
|
151
159
|
*@additional_args
|
152
160
|
]
|
153
161
|
|
@@ -19,6 +19,7 @@ module Pod
|
|
19
19
|
['--framework-output', '输出framework文件'],
|
20
20
|
['--no-zip', '不压缩静态 framework 为 zip'],
|
21
21
|
['--all-make', '对该组件的依赖库,全部制作为二进制组件'],
|
22
|
+
['--configuration', 'Build the specified configuration (e.g. Release ). Defaults to Debug'],
|
22
23
|
['--env', "该组件上传的环境 %w[dev debug_iphoneos release_iphoneos]"]
|
23
24
|
]
|
24
25
|
end
|
@@ -38,6 +39,9 @@ module Pod
|
|
38
39
|
@zip = argv.flag?('zip', true)
|
39
40
|
@all_make = argv.flag?('all-make', false )
|
40
41
|
@verbose = argv.flag?('verbose',true)
|
42
|
+
|
43
|
+
@config = argv.option('configuration', 'Debug')
|
44
|
+
|
41
45
|
super
|
42
46
|
end
|
43
47
|
|
@@ -113,7 +117,7 @@ module Pod
|
|
113
117
|
if @env
|
114
118
|
argvs += ["--env=#{@env}"]
|
115
119
|
end
|
116
|
-
|
120
|
+
argvs += ["--configuration=#{@config}"]
|
117
121
|
|
118
122
|
archive = Pod::Command::Bin::Archive.new(CLAide::ARGV.new(argvs))
|
119
123
|
archive.validate!
|
@@ -83,11 +83,6 @@ module Pod
|
|
83
83
|
FileUtils.rm_rf(target_path)
|
84
84
|
|
85
85
|
find_dependency = find_dependency(name)
|
86
|
-
# 意义不大,需要可以使用--source参数 对 github-ios 仓库对做特殊处理
|
87
|
-
# if find_dependency && find_dependency.external_source[:podspec].include?(http_gitlib_GitHub_iOS_path)
|
88
|
-
# github_ios = find_dependency.external_source[:podspec]
|
89
|
-
# find_dependency.external_source[:podspec] = github_ios.gsub(http_gitlib_GitHub_iOS_path,http_gitlib_iOS_path)
|
90
|
-
# end
|
91
86
|
|
92
87
|
spec = fetch_external_source(find_dependency, @config.podfile,@config.lockfile, @config.sandbox,true )
|
93
88
|
|
@@ -106,7 +101,6 @@ module Pod
|
|
106
101
|
break
|
107
102
|
end
|
108
103
|
end
|
109
|
-
|
110
104
|
find_dependency
|
111
105
|
end
|
112
106
|
|
@@ -150,6 +144,7 @@ module Pod
|
|
150
144
|
FileUtils.rm_rf(File.join(dir,basename))
|
151
145
|
`ln -s #{target_path} #{dir}/#{basename}`
|
152
146
|
end
|
147
|
+
|
153
148
|
check(lib_file,dir,basename)
|
154
149
|
end
|
155
150
|
|
@@ -14,7 +14,7 @@ module CBin
|
|
14
14
|
'configuration_env' => { description: '编译环境', default: 'dev', selection: %w[dev debug_iphoneos release_iphoneos] },
|
15
15
|
'code_repo_url' => { description: '源码私有源 Git 地址', default: 'git@github.com:su350380433/example_spec_source.git' },
|
16
16
|
'binary_repo_url' => { description: '二进制私有源 Git 地址', default: 'git@github.com:su350380433/example_spec_bin_dev.git' },
|
17
|
-
'binary_download_url' => { description: '二进制下载地址,内部会依次传入组件名称与版本,替换字符串中的 %s ', default: 'http://localhost:8080/frameworks/%s/%s
|
17
|
+
'binary_download_url' => { description: '二进制下载地址,内部会依次传入组件名称与版本,替换字符串中的 %s ', default: 'http://localhost:8080/frameworks/%s/%s/zip' },
|
18
18
|
# 'binary_type' => { description: '二进制打包类型', default: 'framework', selection: %w[framework library] },
|
19
19
|
'download_file_type' => { description: '下载二进制文件类型', default: 'zip', selection: %w[zip tgz tar tbz txz dmg] }
|
20
20
|
}
|
@@ -51,7 +51,7 @@ module CBin
|
|
51
51
|
source_dir = Dir.pwd
|
52
52
|
file_accessor = Sandbox::FileAccessor.new(Pathname.new('.').expand_path, @spec.consumer(@platform))
|
53
53
|
Dir.chdir(workspace_directory) do
|
54
|
-
builder = CBin::Framework::Builder.new(@spec, file_accessor, @platform, source_dir
|
54
|
+
builder = CBin::Framework::Builder.new(@spec, file_accessor, @platform, source_dir, @isRootSpec, @build_model )
|
55
55
|
@@build_defines = builder.build if @isRootSpec
|
56
56
|
begin
|
57
57
|
@framework_path = builder.lipo_build(@@build_defines) unless @skip_archive
|
@@ -10,7 +10,7 @@ module CBin
|
|
10
10
|
class Builder
|
11
11
|
include Pod
|
12
12
|
#Debug下还待完成
|
13
|
-
def initialize(spec, file_accessor, platform, source_dir, isRootSpec = true, build_model="
|
13
|
+
def initialize(spec, file_accessor, platform, source_dir, isRootSpec = true, build_model="Debug")
|
14
14
|
@spec = spec
|
15
15
|
@source_dir = source_dir
|
16
16
|
@file_accessor = file_accessor
|
@@ -38,7 +38,7 @@ module CBin
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def lipo_build(defines)
|
41
|
-
UI.section("Building static
|
41
|
+
UI.section("Building static Library #{@spec}") do
|
42
42
|
# defines = compile
|
43
43
|
|
44
44
|
# build_sim_libraries(defines)
|
@@ -68,19 +68,147 @@ module CBin
|
|
68
68
|
`cp -fa #{@platform}/#{framework_name} #{target_dir}`
|
69
69
|
end
|
70
70
|
|
71
|
+
#模拟器,目前只支持 debug x86-64
|
71
72
|
def build_sim_libraries(defines)
|
72
73
|
UI.message 'Building simulator libraries'
|
73
74
|
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
# archs = %w[i386 x86_64]
|
76
|
+
archs = ios_architectures_sim
|
77
|
+
archs.map do |arch|
|
78
|
+
xcodebuild(defines, "-sdk iphonesimulator ARCHS=\'#{arch}\' ", "build-#{arch}",@build_model)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def static_libs_in_sandbox(build_dir = 'build')
|
85
|
+
file = Dir.glob("#{build_dir}/lib#{target_name}.a")
|
86
|
+
unless file
|
87
|
+
UI.warn "file no find = #{build_dir}/lib#{target_name}.a"
|
88
|
+
end
|
89
|
+
file
|
90
|
+
end
|
91
|
+
|
92
|
+
def build_static_library_for_ios(output)
|
93
|
+
UI.message "Building ios libraries with archs #{ios_architectures}"
|
94
|
+
static_libs = static_libs_in_sandbox('build') + static_libs_in_sandbox('build-simulator') + @vendored_libraries
|
95
|
+
# if is_debug_model
|
96
|
+
ios_architectures.map do |arch|
|
97
|
+
static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
|
98
|
+
end
|
99
|
+
ios_architectures_sim do |arch|
|
100
|
+
static_libs += static_libs_in_sandbox("build-#{arch}") + @vendored_libraries
|
101
|
+
end
|
102
|
+
# end
|
103
|
+
|
104
|
+
build_path = Pathname("build")
|
105
|
+
build_path.mkpath unless build_path.exist?
|
106
|
+
|
107
|
+
# if is_debug_model
|
108
|
+
libs = (ios_architectures + ios_architectures_sim) .map do |arch|
|
109
|
+
library = "build-#{arch}/lib#{@spec.name}.a"
|
110
|
+
library
|
111
|
+
end
|
112
|
+
# else
|
113
|
+
# libs = ios_architectures.map do |arch|
|
114
|
+
# library = "build/package-#{@spec.name}-#{arch}.a"
|
115
|
+
# # libtool -arch_only arm64 -static -o build/package-armv64.a build/libIMYFoundation.a build-simulator/libIMYFoundation.a
|
116
|
+
# # 从liBFoundation.a 文件中,提取出 arm64 架构的文件,命名为build/package-armv64.a
|
117
|
+
# UI.message "libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}"
|
118
|
+
# `libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}`
|
119
|
+
# library
|
120
|
+
# end
|
121
|
+
# end
|
122
|
+
|
123
|
+
UI.message "lipo -create -output #{output} #{libs.join(' ')}"
|
124
|
+
`lipo -create -output #{output} #{libs.join(' ')}`
|
125
|
+
end
|
126
|
+
|
127
|
+
def ios_build_options
|
128
|
+
"ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'"
|
129
|
+
end
|
130
|
+
|
131
|
+
def ios_architectures
|
132
|
+
# >armv7
|
133
|
+
# iPhone4
|
134
|
+
# iPhone4S
|
135
|
+
# >armv7s 去掉
|
136
|
+
# iPhone5
|
137
|
+
# iPhone5C
|
138
|
+
# >arm64
|
139
|
+
# iPhone5S(以上)
|
140
|
+
# >i386
|
141
|
+
# iphone5,iphone5s以下的模拟器
|
142
|
+
# >x86_64
|
143
|
+
# iphone6以上的模拟器
|
144
|
+
archs = %w[arm64 armv7]
|
145
|
+
# archs = %w[x86_64 arm64 armv7s i386]
|
146
|
+
# @vendored_libraries.each do |library|
|
147
|
+
# archs = `lipo -info #{library}`.split & archs
|
148
|
+
# end
|
149
|
+
archs
|
150
|
+
end
|
151
|
+
|
152
|
+
def ios_architectures_sim
|
153
|
+
|
154
|
+
archs = %w[x86_64]
|
155
|
+
# TODO 处理是否需要 i386
|
156
|
+
archs
|
157
|
+
end
|
158
|
+
|
159
|
+
def compile
|
160
|
+
defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited)'"
|
161
|
+
defines += ' '
|
162
|
+
defines += @spec.consumer(@platform).compiler_flags.join(' ')
|
163
|
+
|
164
|
+
options = ios_build_options
|
165
|
+
# if is_debug_model
|
166
|
+
archs = ios_architectures
|
167
|
+
# archs = %w[arm64 armv7 armv7s]
|
77
168
|
archs.map do |arch|
|
78
|
-
xcodebuild(defines, "
|
169
|
+
xcodebuild(defines, "ARCHS=\'#{arch}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'","build-#{arch}",@build_model)
|
79
170
|
end
|
171
|
+
# else
|
172
|
+
# xcodebuild(defines,options)
|
173
|
+
# end
|
174
|
+
|
175
|
+
defines
|
176
|
+
end
|
177
|
+
|
178
|
+
def is_debug_model
|
179
|
+
@build_model == "Debug"
|
180
|
+
end
|
181
|
+
|
182
|
+
def target_name
|
183
|
+
#区分多平台,如配置了多平台,会带上平台的名字
|
184
|
+
# 如libwebp-iOS
|
185
|
+
# if @spec.available_platforms.count > 1
|
186
|
+
# "#{@spec.name}-#{Platform.string_name(@spec.consumer(@platform).platform_name)}"
|
187
|
+
# else
|
188
|
+
@spec.name
|
189
|
+
# end
|
190
|
+
end
|
191
|
+
|
192
|
+
def xcodebuild(defines = '', args = '', build_dir = 'build', build_model = 'Debug')
|
193
|
+
|
194
|
+
unless File.exist?("Pods.xcodeproj") #cocoapods-generate v2.0.0
|
195
|
+
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{File.join(File.expand_path("..", build_dir), File.basename(build_dir))} clean build -configuration #{build_model} -target #{target_name} -project ./Pods/Pods.xcodeproj 2>&1"
|
80
196
|
else
|
81
|
-
xcodebuild
|
197
|
+
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{build_model} -target #{target_name} -project ./Pods.xcodeproj 2>&1"
|
82
198
|
end
|
83
199
|
|
200
|
+
UI.message "command = #{command}"
|
201
|
+
output = `#{command}`.lines.to_a
|
202
|
+
|
203
|
+
if $CHILD_STATUS.exitstatus != 0
|
204
|
+
raise <<~EOF
|
205
|
+
Build command failed: #{command}
|
206
|
+
Output:
|
207
|
+
#{output.map { |line| " #{line}" }.join}
|
208
|
+
EOF
|
209
|
+
|
210
|
+
Process.exit
|
211
|
+
end
|
84
212
|
end
|
85
213
|
|
86
214
|
def copy_headers
|
@@ -89,12 +217,17 @@ module CBin
|
|
89
217
|
|
90
218
|
#by slj 如果没有头文件,去 "Headers/Public"拿
|
91
219
|
# if public_headers.empty?
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
220
|
+
spec_header_dir = "./Headers/Public/#{@spec.name}"
|
221
|
+
unless File.exist?(spec_header_dir)
|
222
|
+
spec_header_dir = "./Pods/Headers/Public/#{@spec.name}"
|
223
|
+
end
|
224
|
+
raise "copy_headers #{spec_header_dir} no exist " unless File.exist?(spec_header_dir)
|
225
|
+
Dir.chdir(spec_header_dir) do
|
226
|
+
headers = Dir.glob('*.h')
|
227
|
+
headers.each do |h|
|
228
|
+
public_headers << Pathname.new(File.join(Dir.pwd,h))
|
97
229
|
end
|
230
|
+
end
|
98
231
|
# end
|
99
232
|
|
100
233
|
# UI.message "Copying public headers #{public_headers.map(&:basename).map(&:to_s)}"
|
@@ -110,7 +243,7 @@ module CBin
|
|
110
243
|
module_map_file = @file_accessor.module_map
|
111
244
|
if Pathname(module_map_file).exist?
|
112
245
|
module_map = File.read(module_map_file)
|
113
|
-
|
246
|
+
end
|
114
247
|
elsif public_headers.map(&:basename).map(&:to_s).include?("#{@spec.name}.h")
|
115
248
|
module_map = <<-MAP
|
116
249
|
framework module #{@spec.name} {
|
@@ -126,7 +259,7 @@ module CBin
|
|
126
259
|
UI.message "Writing module map #{module_map}"
|
127
260
|
unless framework.module_map_path.exist?
|
128
261
|
framework.module_map_path.mkpath
|
129
|
-
|
262
|
+
end
|
130
263
|
File.write("#{framework.module_map_path}/module.modulemap", module_map)
|
131
264
|
end
|
132
265
|
end
|
@@ -138,8 +271,11 @@ module CBin
|
|
138
271
|
end
|
139
272
|
|
140
273
|
def copy_resources
|
274
|
+
resource_dir = './build/*.bundle'
|
275
|
+
resource_dir = './build-armv7/*.bundle' if File.exist?('./build-armv7')
|
276
|
+
resource_dir = './build-arm64/*.bundle' if File.exist?('./build-arm64')
|
141
277
|
|
142
|
-
bundles = Dir.glob(
|
278
|
+
bundles = Dir.glob(resource_dir)
|
143
279
|
|
144
280
|
bundle_names = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
|
145
281
|
consumer = spec.consumer(@platform)
|
@@ -160,7 +296,13 @@ module CBin
|
|
160
296
|
`cp -rp #{bundle_files} #{framework.resources_path} 2>&1`
|
161
297
|
end
|
162
298
|
|
163
|
-
|
299
|
+
spec_source_dir = File.join(Dir.pwd,"#{@spec.name}")
|
300
|
+
unless File.exist?(spec_source_dir)
|
301
|
+
spec_source_dir = File.join(Dir.pwd,"Pods/#{@spec.name}")
|
302
|
+
end
|
303
|
+
raise "copy_resources #{spec_source_dir} no exist " unless File.exist?(spec_source_dir)
|
304
|
+
|
305
|
+
real_source_dir = @isRootSpec ? @source_dir : spec_source_dir
|
164
306
|
resources = [@spec, *@spec.recursive_subspecs].flat_map do |spec|
|
165
307
|
expand_paths(real_source_dir, spec.consumer(@platform).resources)
|
166
308
|
end.compact.uniq
|
@@ -173,122 +315,14 @@ module CBin
|
|
173
315
|
if resources.count > 0
|
174
316
|
#把 路径转义。 避免空格情况下拷贝失败
|
175
317
|
escape_resource = []
|
176
|
-
|
177
|
-
|
318
|
+
resources.each do |source|
|
319
|
+
escape_resource << Shellwords.join(source)
|
178
320
|
end
|
179
321
|
UI.message "Copying resources #{escape_resource}"
|
180
322
|
`cp -rp #{escape_resource.join(' ')} #{framework.resources_path}`
|
181
323
|
end
|
182
324
|
end
|
183
325
|
|
184
|
-
def static_libs_in_sandbox(build_dir = 'build')
|
185
|
-
file = Dir.glob("#{build_dir}/lib#{target_name}.a")
|
186
|
-
unless file
|
187
|
-
UI.warn "file no find = #{build_dir}/lib#{target_name}.a"
|
188
|
-
end
|
189
|
-
file
|
190
|
-
end
|
191
|
-
|
192
|
-
def build_static_library_for_ios(output)
|
193
|
-
UI.message "Building ios libraries with archs #{ios_architectures}"
|
194
|
-
static_libs = static_libs_in_sandbox('build') + static_libs_in_sandbox('build-simulator') + @vendored_libraries
|
195
|
-
if is_debug_model
|
196
|
-
ios_architectures.map do |arch|
|
197
|
-
static_libs += static_libs_in_sandbox("build-#{arch}") + static_libs_in_sandbox('build-simulator') + @vendored_libraries
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
build_path = Pathname("build")
|
202
|
-
build_path.mkpath unless build_path.exist?
|
203
|
-
|
204
|
-
libs = ios_architectures.map do |arch|
|
205
|
-
library = "build/package-#{@spec.name}-#{arch}.a"
|
206
|
-
# libtool -arch_only arm64 -static -o build/package-armv64.a build/libIMYFoundation.a build-simulator/libIMYFoundation.a
|
207
|
-
# 从liBFoundation.a 文件中,提取出 arm64 架构的文件,命名为build/package-armv64.a
|
208
|
-
UI.message "libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}"
|
209
|
-
`libtool -arch_only #{arch} -static -o #{library} #{static_libs.join(' ')}`
|
210
|
-
library
|
211
|
-
end
|
212
|
-
UI.message "lipo -create -output #{output} #{libs.join(' ')}"
|
213
|
-
`lipo -create -output #{output} #{libs.join(' ')}`
|
214
|
-
end
|
215
|
-
|
216
|
-
def ios_build_options
|
217
|
-
"ARCHS=\'#{ios_architectures.join(' ')}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'"
|
218
|
-
end
|
219
|
-
|
220
|
-
def ios_architectures
|
221
|
-
# >armv7
|
222
|
-
# iPhone4
|
223
|
-
# iPhone4S
|
224
|
-
# >armv7s 去掉
|
225
|
-
# iPhone5
|
226
|
-
# iPhone5C
|
227
|
-
# >arm64
|
228
|
-
# iPhone5S(以上)
|
229
|
-
# >i386
|
230
|
-
# iphone5,iphone5s以下的模拟器
|
231
|
-
# >x86_64
|
232
|
-
# iphone6以上的模拟器
|
233
|
-
archs = %w[x86_64 arm64 armv7]
|
234
|
-
# archs = %w[x86_64 arm64 armv7s i386]
|
235
|
-
@vendored_libraries.each do |library|
|
236
|
-
archs = `lipo -info #{library}`.split & archs
|
237
|
-
end
|
238
|
-
archs
|
239
|
-
end
|
240
|
-
|
241
|
-
def compile
|
242
|
-
defines = "GCC_PREPROCESSOR_DEFINITIONS='$(inherited)'"
|
243
|
-
defines += ' '
|
244
|
-
defines += @spec.consumer(@platform).compiler_flags.join(' ')
|
245
|
-
|
246
|
-
options = ios_build_options
|
247
|
-
if is_debug_model
|
248
|
-
archs = %w[arm64 armv7]
|
249
|
-
# archs = %w[arm64 armv7 armv7s]
|
250
|
-
archs.map do |arch|
|
251
|
-
xcodebuild(defines, "ARCHS=\'#{arch}\' OTHER_CFLAGS=\'-fembed-bitcode -Qunused-arguments\'","build-#{arch}",@build_model)
|
252
|
-
end
|
253
|
-
else
|
254
|
-
xcodebuild(defines,options)
|
255
|
-
end
|
256
|
-
|
257
|
-
defines
|
258
|
-
end
|
259
|
-
|
260
|
-
def is_debug_model
|
261
|
-
@build_model == "Debug"
|
262
|
-
end
|
263
|
-
|
264
|
-
def target_name
|
265
|
-
#区分多平台,如配置了多平台,会带上平台的名字
|
266
|
-
# 如libwebp-iOS
|
267
|
-
# if @spec.available_platforms.count > 1
|
268
|
-
# "#{@spec.name}-#{Platform.string_name(@spec.consumer(@platform).platform_name)}"
|
269
|
-
# else
|
270
|
-
@spec.name
|
271
|
-
# end
|
272
|
-
end
|
273
|
-
|
274
|
-
def xcodebuild(defines = '', args = '', build_dir = 'build',build_model = 'Release')
|
275
|
-
#xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(inherited)' ARCHS='x86_64 arm64 armv7 armv7s i386' OTHER_CFLAGS='-fembed-bitcode -Qunused-arguments' CONFIGURATION_BUILD_DIR=build clean build -configuration Debug -target IMYTCP -project ./Pods.xcodeproj 2>&1
|
276
|
-
# xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(inherited)' -sdk iphoneos CONFIGURATION_BUILD_DIR=build-simulator clean build -configuration Release -target IMYFoundation -project ./Pods/Pods.xcodeproj 2>&1
|
277
|
-
command = "xcodebuild #{defines} #{args} CONFIGURATION_BUILD_DIR=#{build_dir} clean build -configuration #{build_model} -target #{target_name} -project ./Pods.xcodeproj 2>&1"
|
278
|
-
UI.message "command = #{command}"
|
279
|
-
output = `#{command}`.lines.to_a
|
280
|
-
|
281
|
-
if $CHILD_STATUS.exitstatus != 0
|
282
|
-
raise <<~EOF
|
283
|
-
Build command failed: #{command}
|
284
|
-
Output:
|
285
|
-
#{output.map { |line| " #{line}" }.join}
|
286
|
-
EOF
|
287
|
-
|
288
|
-
Process.exit
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
326
|
def expand_paths(source_dir, path_specs)
|
293
327
|
path_specs.map do |path_spec|
|
294
328
|
Dir.glob(File.join(source_dir, path_spec))
|
@@ -302,6 +336,8 @@ module CBin
|
|
302
336
|
framework
|
303
337
|
end
|
304
338
|
end
|
339
|
+
|
340
|
+
|
305
341
|
end
|
306
342
|
end
|
307
343
|
end
|
@@ -38,12 +38,12 @@ module CBin
|
|
38
38
|
|
39
39
|
def make_headers
|
40
40
|
@headers_path = @versions_path + Pathname.new('Headers')
|
41
|
-
|
41
|
+
@headers_path.mkpath unless @headers_path.exist?
|
42
42
|
end
|
43
43
|
|
44
44
|
def make_resources
|
45
45
|
@resources_path = @versions_path + Pathname.new('Resources')
|
46
|
-
|
46
|
+
@resources_path.mkpath unless @resources_path.exist?
|
47
47
|
end
|
48
48
|
|
49
49
|
def make_root
|
@@ -21,8 +21,11 @@ module CBin
|
|
21
21
|
# 只允许二进制的 specification subspec 比源码的 specification subspec 多
|
22
22
|
#
|
23
23
|
def valid_sources(code_dependencies = false)
|
24
|
-
sources = [
|
25
|
-
|
24
|
+
sources = [code_source]
|
25
|
+
unless code_dependencies
|
26
|
+
sources << binary_source
|
27
|
+
sources.reverse!
|
28
|
+
end
|
26
29
|
sources
|
27
30
|
end
|
28
31
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-imy-bin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 苏良锦
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parallel
|
@@ -169,8 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
169
|
- !ruby/object:Gem::Version
|
170
170
|
version: '0'
|
171
171
|
requirements: []
|
172
|
-
|
173
|
-
rubygems_version: 2.5.2.3
|
172
|
+
rubygems_version: 3.0.1
|
174
173
|
signing_key:
|
175
174
|
specification_version: 4
|
176
175
|
summary: cocoapods-imy-bin is a plugin which helps develpers switching pods between
|