iOS使用Cocoapods进行组件化操作手册

3,305 阅读6分钟

前言

随着工程体量的增大,开发人员增多,为了更好的合作开发,常常我们需要对大工程进行拆分成一个个小工程,这样做有几点好处:

  1. 加快开发效率,如果我们在一个大工程进行迭代开发,常常编译时间就很长,如果你开发的是一个入口比较深的模块,开发调试时,仅仅修改了一下UI界面位置等,重新编译运行然后再点点点到对应界面,常常浪费很多时间。而将模块拆成单独一个可执行的工程后,编译运行调试的时间大大缩减。
  2. 并行开发,由于每个子工程都可以进行单独的版本控制,子工程在开发新功能中时,主工程可依赖低版本的子工程,不影响主工程的运行。
  3. 分工性提高,不同子工程可由不同人员甚至不同团队负责。
  4. 代码共享,不同app工程可方便快捷的复用组件。

下面我们就通过pod来创建一个子工程并通过pod在主工程来引入

操作步骤

一、创建子工程

  1. 使用Xcode新建一个工程例如叫HomeModule
  2. 常常我们会再创建一个Demo项目来做示例,这里我们可以在HomeModule目录下创建一个名为HomeModuleDemo的工程
  3. 为了方便起见,在HomeModule目录下创建一个名为Classes的文件夹,将需要导出的代码类都放在这个文件夹下,建立一个Resources文件夹,将需要导出的资源文件放在这个目录下
  4. cd到HomeModule工程目录,输入命令pod spec create HomeModule,这段命令会在目录下生成HomeModule.podspec文件,这个文件其实就是对这个工程的描述,例如工程名称、托管地址、需要导出哪些文件等

下面是进行到这一步的目录示例图

  1. 好了,现在可以先将这个项目托管到线上git仓库

  2. 打开HomeModule.podspec做一些编辑,下面是一些常用配置的编辑

Pod::Spec.new do |s|

  s.name         = "HomeModule"
  s.version      = "0.0.1"
  s.summary      = "HomeModule is a ...."
  s.homepage     = "https://github.com/xxx"
  s.license      = "MIT"
  s.author       = {
                    "xxx" => "xxx@gmail.com",
                    }
  s.source        = { :git => "https://github.com/xxx/HomeModule.git", :tag => "#{s.version}" }
  s.source_files  = "Classes/*.{h,m}"
  s.resources = "Resources/*.png"
  s.requires_arc  = true

  s.ios.deployment_target = "7.0"
  s.osx.deployment_target = "10.9"
  s.watchos.deployment_target = "2.0"
  s.tvos.deployment_target = "9.0"
  s.frameworks    = 'UIKit'
  s.dependency 'Masonry', '~> 0.6.2'
end

值得关注的是下面几个点

  • s.source 是项目托管地址
  • s.source_files 需要导出的文件,就是最终其它工程通过pod引入你这个项目时的文件,这里就体现了pod的好处,我们开发组件时可以是个完整的iOS工程,可单独开发运行调试,通过pod给别人用时就只需要导出核心的那些文件就行了
  • s.resources 需要导出的资源文件
  • 如果在Classes和Resources目录下,你建了二级目录的话,需要写成这样s.source_files = "Classes/**/*.{h.m}" s.resources作同样的写法
  • s.frameworks 你依赖的系统库
  • s.dependency 你依赖的其它第三方pod库
  1. 开发HomeModule模块,添加新功能
  2. 将HomeModule新代码push到git仓库,并创建一个tag 0.0.1

二、创建私有Cocoapods Specs仓库

这个仓库主要用来托管我们自己的podspec文件,就是本例中的HomeModule.podspec,例如以后的ShopCartModule.podspec等等...

Cocoapods的官方spec仓库是https://github.com/CocoaPods/Specs,很多我们常用的第三方库例如AFNetworking的podspec文件就托管在这个仓库里面,在我们第一次使用cocoapods的时候就会将这个仓库克隆到本地的user/xxx/.cocoadpos/repos/master,你可进入这个目录看看,就会发现每个库的每个版本的podspec文件都在里面,当我们通过pod search搜索第三发库的时候,实际就是在搜索这个目录。有些时候一些第三方库已经发布新版本了,但我们搜索到的还是老版本,就是因为这个库没有更新。

下图为克隆到本地的Cocoapods官方Specs仓库:

克隆到本地的Cocoapods官方Specs仓库
通过命令pod repo list我们可以看到本地有哪些spec仓库,以及仓库的url和本地地址信息等,如下图中是Cocoapods官方Spec仓库,名为master

master
- Type: git (master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/geforceyu/.cocoapods/repos/master

顺便提一下,很多同学会知道pod updatepod setup都非常慢,这两个命令都会更新这个仓库,大家可以将master仓库的url切换为清华大学的cocoapods官方spec镜像源,具体详见清华大学软件源

好了,了解完官方spec仓库后,我们可以开始创建自己的spec仓库了。

  1. 直接在gitlab或是github上创建一个空仓库名为xxxPodSpecs
  2. 将这个仓库clone到本地的.cocoapod/repos/xxxPodSpecs,当然这里使用pod命令行工具来执行,pod repo add xxxPodSpecs https://github/xxx/xxxPodSpecs.git,执行完成后再执行pod repo list就可以看到我们私有的spec仓库在列了。
  3. 将我们的HomeModule.podspecs托管到我们才创建的私有spec仓库,具体操作为cd 到HomeModule.podspec目录下,执行pod repo push xxxPodSpecs HomeModule.podspec,这里pod会执行一次校验,一般会报一些warn,你可以去解决一下,如果不想解决直接忽略的话,执行pod repo push xxxPodSpecs HomeModule.podspec --allow-warnings,不过如果是error错误,是无法忽略的。这里顺便提一下,在我使用1.5.3版本pod执行的时候,会报一个error是bug引起的,无法解决,通过升级到最新版pod就好了,升级pod只需要执行sudo gem install cocoapods就行了。如果你想多个pod切换使用,请参考这篇文章多个版本的 CocoaPods 的切换

三、主工程集成

  1. 打开我们的主工程的podfile文件,在头部添加两行
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/xxx/xxxPodSpecs.git'

在后面就可以添加pod引用HomeMoudle了

pod 'HomeModule', '0.0.1'

可以看到一个是官方specs仓库,一个是我们私有spec仓库,因为我们自己的HomeModule.podspec文件是托管到私有的xxxPodSpecs仓库的,如果不添加我们自己的私有spec仓库源,那么pod install的时候是在官方spec仓库搜索HomeModule.podspec的。

四、新版本发布

当我们继续为子工程HomeModule开发新的功能后,我们需要更新我们的版本,具体操作如下

  1. 将HomeModule项目新代码push到git仓库,并且创建0.0.2的tag
  2. 修改HomeModule.podspec的s.version为0.0.2
  3. cd到HomeModule.podspec目录执行pod repo push xxxPodSpecs HomeModule.podspec --allow-warnings
  4. 主工程的podfile更新为
pod 'HomeModule', '0.0.2'
  1. 主工程执行pod install

扩展

Demo工程配置

通常我们会通过一个demo工程来给他人演示库的一些用法,首先我们需要将demo工程通过pod集成我们的HomeMoudle

  1. cdHomeModuleDemo目录,执行pod init创建一个podfile。编辑podfile文件添加HomeModuel引入
target 'HomeModuleDemo' do
  pod 'HomeModule', :path => '../'
end

这里我们通过:path => '../'直接指向本地的HomeModule.spec地址即可。

  1. pod install
  2. 打开HomeMoudleDemo.xcworkspace,开始编写示例代码。

谢谢

好了,大致的操作步骤就这些,文章中哪些地方不够详细或者错误的,欢迎各位看官指正出来,谢谢🙏