优化cocoapods-imy-bin插件

背景

使用二进制组件需要业务方安装插件

业务方比较多,对二进制的需求参差不齐,都要安装插件不太,侵入性太强,不利于业务方自由使用。

image

二进制打包会忽略subspec的源文件以及依赖库

忽略subspec的打包,需要手动一个个添加进去比较麻烦,这一步可以实现自动化。

image

解决

业务方不需要安装cocoapods-imy-bin插件

  • 修改插件,对生成bin私有库的文件重命名,去除binary字段,实现能够原生pod解析。
image
  • 安装cocoapods-prefer插件

gem install cocoapods-prefer --user-install

  • 编辑podfile添加二进制source,优先使用二进制source源。
plugin 'cocoapods-prefer'
prefer_source("xxx-spec_bin_dev","[email protected]: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
image

优化的代码

https://github.com/jackyshan/cocoapods-imy-bin

参考

  • iOS开源二进制使用插件cocoapods-imy-bin

你可能感兴趣的:(优化cocoapods-imy-bin插件)