iOS模块化之cocoapods管理私有库

为什么要组件化
  • 随着项目的不断迭代,各个模块会越来越复杂,各个模块相互依赖,而且每个模块可能会有共同的业务逻辑,导致整个项目维护起来比较麻烦。
  • 可以采用组件化,把每个业务逻辑和模块分离,单独管理,这样比较方便维护,各个开发人员只需要关心好自己的模块就好了。
组件化好处
  • 分工更加明确,提高开发效率
  • 复用性更好,能迅速的组成更多的App
组件化思想
  • 就好比封装控件,复杂的控件一般都会封装,组件化只不过是把每个模块单独抽出来,作为一个小工程,然后在组成一个一个完整的项目。
cocoapods中的spec文件
  • podspec:描述自己组件工程的代码目录和资源目录在哪,还有自己组件工程所依赖其他框架,到时候就会根据podspec的指引去引入自己的仓库代码github中所有能能cocoapods管理的开源库中都有一个podspec文件,也就是pod描述文件
  • 为框架添加sepc文件命令:pod spec create spec文件名
 // 创建pod索引库,固定写法,并且定义索引库的名字为s,后续通过s,就能拿到索引库
  Pod::Spec.new do |s|

    // 设置名称
    s.name         = "testMulProjs"

    // 设置版本号
    s.version      = "0.0.1"

    // 设置摘要
    s.summary      = "A short description of testMulProjs."

    // 设置详情
    s.description  = "a simple popmenu"

    // 设置仓库主页
    s.homepage     = "https://github.com/Ge3kXm"

    // 设置许可证
    s.license      = "MIT"

    // 设置作者
    s.author             = { 'Ge3kXm' => 'ge3kxm@gmail.com' }

    // 设置仓库源,表示在哪可以找到组件工程
    s.source       = { :git => "", :tag => "#{s.version}" }

    // 设置 源文件路径 => 不是整个工程的文件,而是自己封装的代码,以后别的工程引入,就会引入这里的代码。
    s.source_files  = "testMulProjs/testMulProjs/**/*"

   // s.dependency = '' 组件工程依赖哪些第三方框架
   // s.frameworks = 'UIKit', 'MapKit' 组件工程依赖哪些原生框架
   // s.resource_bundles = {} 组件工程图片资源

  end
  • 注意点:
    • s.source_files仅仅描述组件代码就好,不要描述整个工程名文件,会把所有文件集成上去
    • s.licence不要瞎写
    • s.version中的版本要与tag版本号一致
    • s.description不能为空
    • cocoapods版本至少为1.2.1以上否则可能解析sepc报错
  • 上传库到git平台步骤:
    • 创建并设置spec文件
    • 本地提交到远程仓库
    • 给代码打上tag,tag号要与spec中的版本号一直 git tag -a "0.0.1" -m "0.0.1"
    • 推到远程仓库git push --tags
    • 若账号没有注册trank,不是任何人都能推送,因为cocoapods依赖trunk服务器管理,所以需要通过trunk推送自己的podspec pod trunk register 7624619@qq.com HttpManager.podspec,并到邮箱进行验证
    • 推送sepc到索引库 pod trunk push HttpManager.podspec --allow-warnings
    • 完毕后可以用pod search命令搜索
    • pod setup命令会从源spec库中下载索引到本地并更新,若刚上传spec文件而search不到,可以重新执行pod setup命令或者删除~/Library/Caches/CocoaPods/searchindex.json目录下的searchindex.json文件再执行pod search
cocoapods中的podfile文件
  • podFile文件:指定主工程加载哪些组件库,里面描述好组件库对应的podspec文件在哪,就知道去哪加载组件代码。
  • 创建podfile:工程目录下pod init或者直接touch Podfile
  • cocoapods加载远程库:略
  • cocoapods加载本地库:

    • 将本地组件拖入主工程目录中,且组件中的spec文件已经设置完毕
    • 在主工程目录下的podfile中添加pod ‘testMulProjs’, :path => ‘testMulProjs’,path路径指向相对当前podfile文件至组件文件sepc文件的路径 一张图片
cocoapods创建组件工程
  • 1:手动创建,如本地库一样手动创建库工程,配置spec文件,然后拖入主工程,再设置主工程的podfile
  • 2:用cocoapods命令:pod lib create 组件代码名称就会自动创建带组件工程的工程,我们只需将需要的组件文件放入Classes中,podsepc中已经设置source_file为Classes,然后重新pod install,作用为将重新让pod库与所依赖的工程文件产生关联 一张图片
cocoapods设置私有库
  • 有些公司核心的代码不想开源,就不能放在cocoapods公共的索引库中,也不能放在本地,因为以后需要多人开发,cocoapods支持创建自己的私有索引库,只需要把自己的代码仓库放在自己的私有索引库就好了
  • 私有化步骤:
    • 1.先有一个私有库平台,公司的,或者网上的,创建一个git仓库https://git.coding.net/ge3kxm/podSepc.git
    • 2.添加本地索引pod repo add CustomLocalPodSpecName https://git.coding.net/ge3kxm/podSepc.git前面是本地仓库名,后面是远程仓库地址
    • 3.在上传本地podsepc文件到私有仓库之前,最好先验证依赖和编译是否能通过,通过命令: pod spec lint --sources='本地仓库路径,https://github.com/CocoaPods/Specs.git' xxx.podsepc,若不加--sources参数则默认在cocoapod中加载依赖,若仓库依赖了本地私有库,则需要也将私有库地址添加进来
    • 4.切换到spec文件目录下pod repo push CustomLocalPodSpecName MXpopupMenu.podspec --allow-warnings,本地索引库就会有自己的私有库,并且远程也会有,pod repo push会帮我们推送到远程索引库
  • 私有库使用
    • 由于cocoapods默认是source 'https://github.com/CocoaPods/Specs.git'源,如果要使用自己的私有库,需要先手动添加sepc仓库地址source 'https://git.coding.net/ge3kxm/podSepc.git'
    • podfile添加pod 'MXPopupMenu'
    • pod install
    • 注意:pod search不到自己的库,可能是源没有添加,或者源中的索引库已经更新但是本地没有更新,可以pod setup来重新更新本地索引库
  • 私有库更新
    • 若更新组件,需要重新设置spec文件,打上tag,pod repo push podSpec MXpopupMenu.podspec --allow-warnings更新本地和远程spec仓库
    • 主工程使用pod update --no-repo-update更新,若需要更新本地索引库使用命令pod update