iOS组件化开发之Pod私有库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rigel_xu/article/details/54693849

iOS组件化开发之Pod私有库

组件化的目的:

  • 依赖解耦
  • 开发灵活
  • 团队分工明确
  • 提高代码质量
  • 加快编译速度
  • 解决多团队开发相互影响问题

工具-必选:

  • cocoapods 1.x 之后版本
  • cocoapods-packager
  • gitlab

工具-可选:

  • zsh
  • item2

cocoapods 是支持 svn 的,但是 git 相对方便一些。
`
**注:**以
OTBase` 为例

一、创建私有库

1、创建标准工程

为方便快速生成统一工程结构的组件工程,使用如下命令来创建工程。如何使用 pod lib

`pod lib create OTBase` 

目录结构如下:

├── Example
│   ├── OTBase
│   ├── OTBase.xcodeproj
│   ├── OTBase.xcworkspace
│   ├── Pods
│   └── Tests
├── OTBase
│   ├── Assets
│   └── Classes
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj

主要有两部分组成

  1. OTBase: 组件源码
  2. Example:Demo 工程,会 pod OTBase 库到此 demo 工程,方便调试

pod lib会从 github 下载模版工程,创建完成会自动打开 Example 下的OTBase.xcworkspace,在 pod 的工程下有一个Development Pods目录,pod 把我们的源码做为 Demo 工程的一个 pod 库,这跟实际使用是一样的了。只不过我们要改源码。

2、修改 podspec

修改 OTBase.podspec内容,参考:

Pod::Spec.new do |s|
  s.name             = 'OTBase'
  s.version          = '0.1.0'
  s.summary          = 'Modular develope base module.'
  s.description      = <<-DESC
  Base module is required for other module.
                       DESC

  s.homepage         = 'http://git.rigelxu.com/iOS_Base_Framework'
  s.license          = { :type => 'Copyright', :text => 'Copyright 2016, All rights reserved.\n' }
  s.author           = { 'Rigel' => '[email protected]' }
  s.source           = { :git => 'http://git.rigelxu.com/iOS_Base_Framework.git', :branch => 'master' }     # :tag => s.version.to_s }
  s.source_files = 'OTBase/Classes/**/*'
  s.ios.deployment_target = '8.0'
  s.frameworks = 'UIKit'
  s.dependency 'MGJRouter', '~> 0.9.1'
end

为了方便s.source 可以暂时指定 master分支或者所在的分支。

3、打包

pod package OTBase.podspec

cocoapods-packager会打好可用的 framework 包含模拟器和真机。包放在工程目录下的OTBase-0.1.0/ios.

注:pod package 默认使用的是 release 模式,如果需要打 debug,添加上参数--configuration

注意:如果需要切换源码和二进制库,需要将打好的.framework 上传到存放二进制库的单独仓库的与 podspec 版本对应的 tag 上。

4、提交组件至私有仓库

更详细的发布流程
上面已经打出 framework,可以直接手动导 framework 的方式使用。当然更好的方法是使用 pod.

  • 在 gitlab创建一个spec仓库
  • 所有需要使用此仓库的电脑上,添加pod私有仓库

    pod repo add 仓库名 仓库地址

  • 验证 podspec
    pod spec lint OTBase.podspec --allow-warnings

  • 提交 podspec文件到 spec 仓库

    pod repo push OTSpec OTBase.podspec

5、源码、静态库切换

我们使用的第三方库,pod到工程里的都是源码,pod 会在我们编译的时候打成静态库/动态库。但是组件开发的时候为了提高编译效率,默认使用静态库比较好,只有在需要的时候,比如遇到问题需要 debug,发布生产,再 pod 源码到工程。

那么如何快速方便的切换源码和静态库?有以下几个思路:

  • 方法一:使用不同的 podspec,一个指向源码,一个指向二进制库;使用时在 podfile 里修改对应库名即可。比如静态库是 pod 'OTBase',源码是pod 'OTBase_source_code'
  • 方法二:添加环境变量,podspec 里添加判断如下:

       if ENV['IS_SOURCE_CODE']
            s.source_files = 'OTBase/Classes/**/*'
        else
           s.ios.vendored_frameworks = 'OTBase-0.1.0/ios/OTBase.framework'
       end
    

需要使用源码时在命令前添加环境变量:如

IS_SOURCE_CODE=1 pod install

如果考虑源码保密问题,可以将 framework 单独放一个仓库管理。podspec 的配置如下:

      if ENV['IS_SOURCE_CODE'] || ENV['OTBase_SOURCE']
        puts 'OTBase is  source'
        s.source           = { :git => 'http://github.com/OurTeam/iOS_Base_Framework.git', :branch => 'master' } 
        s.source_files = 'OTBase/Classes/**/*'
      else
        puts 'OTBase is binary'
    s.source           = { :git => 'http://github.com/OurTeam_Binary/iOS_Base_Framework.git'  :tag => s.version.to_s}
        s.resource      = 'OTBase.bundle' #有资源时使用,注意将.framework 里的资源bundle 删除,`.bundle` 与 `.framework` 一起打包成.zip
        s.ios.vendored_frameworks = 'OTBase.framework'
      end

二、使用私有库

  1. 添加组件私有仓库

    pod repo add OTSpec http://github.com/OurTeam/spec.git
    
  2. 添加私有 repo 到 podfile,同时还需要添加原 pod master 仓库,如下:

    source https://git.xxx.com/spec.git
    source 'https://github.com/CocoaPods/Specs.git

  3. 将要使用的组件添加至 Podfile pod install

  4. 当需要 pod 源码的时候先清理,再 install

    pod cache clean OTBase
    rm -rf Pods/OTBase
    IS_SOURCE_CODE=1 pod install
    

三、一些坑

  1. 如果使用的是 git-lib,如果 group 是私有的,那么无法创建 public 仓库
  2. 之前直接把.framework上传到 git-lib,以 http 下载文件的方式经常解压失败,换到其它 http 服务器 ok 了,可能文件跟文件的有效期有关。二进制库也使用 git 仓库的形式也没这种问题了。
  3. 使用了环境变量后打包命令也要修改,IS_SOURCE_CODE=1 pod package OTBase.podspec
  4. 如果有资源,资源会打包到 Framework 目录里。在使用二进制文件时,需要删除Framework里的资源文件,将资源 .bundle.framework 一起打包成.zip,参考此文:Pod二进制化
  5. 在源码和二进制文件进行切换时,一定要先执行清理。pod cache clean xxx, 然后再删除 Pods目录
  6. 某个组件可以添加一个单独的环境变量,以方便此开发中的组件使用源码,其它组件使用二进制文件。否则Example 工程 pod install 的时候 OTBase target 就消失了,因为默认使用了二进制的库。

猜你喜欢

转载自blog.csdn.net/rigel_xu/article/details/54693849
今日推荐