背景
使用二进制组件需要业务方安装插件
业务方比较多,对二进制的需求参差不齐,都要安装插件不太,侵入性太强,不利于业务方自由使用。
二进制打包会忽略subspec的源文件以及依赖库
忽略subspec的打包,需要手动一个个添加进去比较麻烦,这一步可以实现自动化。
解决
业务方不需要安装cocoapods-imy-bin插件
- 修改插件,对生成bin私有库的文件重命名,去除binary字段,实现能够原生pod解析。
- 安装cocoapods-prefer插件
gem install cocoapods-prefer --user-install
- 编辑podfile添加二进制source,优先使用二进制source源。
plugin 'cocoapods-prefer'
prefer_source("xxx-spec_bin_dev","git@code.xxx.cn:gz/iOS/common/spec_bin_dev.git")
自动打包所有的subspec
- 解析Specification,生成hashmap
@code_spec = Pod::Specification.from_file(@podspec)
@spec = code_spec.dup
spec_hash = @spec.to_hash
- 取出subspecs,遍历subspec的依赖,集合到最上层
dps_hash = Hash[]
subdps = subspecs.each do |sub|
sub.delete('exclude_files')
dps_hash = dps_hash.merge(Hash(sub['dependencies']))
end
dps_hash = dps_hash.reject { |key, value| key.include?(spec_hash['name'])}
spec_hash['dependencies'] = dps_hash
- 遍历subspec的name,集合到新的default_subspecs
subnames = subspecs.map { |sub| sub['name']}
spec_hash['default_subspecs'] = 'xxxBin'
bin = Hash["name" => 'InkeBin']
dependencies = Hash[]
subnames.each { |name|
dependencies["#{spec_hash['name']}/#{name}"] = Array.new
}
bin['dependencies'] = dependencies
subspecs.insert(0, bin)
- 把hashmap转换成Specification
@spec = Pod::Specification.from_hash(spec_hash)
- 修改插件,添加转换Specification的代码,编译gem,测试成功打包subspecs
优化的代码
https://github.com/jackyshan/cocoapods-imy-bin