美文网首页
优化cocoapods-imy-bin插件

优化cocoapods-imy-bin插件

作者: jackyshan | 来源:发表于2021-06-26 10:43 被阅读0次

    背景

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

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

    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","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
    image

    优化的代码

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

    参考

    相关文章

      网友评论

          本文标题:优化cocoapods-imy-bin插件

          本文链接:https://www.haomeiwen.com/subject/jvsoyltx.html