前言
随着工程体量的增大,开发人员增多,为了更好的合作开发,常常我们需要对大工程进行拆分成一个个小工程,这样做有几点好处:
- 加快开发效率,如果我们在一个大工程进行迭代开发,常常编译时间就很长,如果你开发的是一个入口比较深的模块,开发调试时,仅仅修改了一下UI界面位置等,重新编译运行然后再点点点到对应界面,常常浪费很多时间。而将模块拆成单独一个可执行的工程后,编译运行调试的时间大大缩减。
- 并行开发,由于每个子工程都可以进行单独的版本控制,子工程在开发新功能中时,主工程可依赖低版本的子工程,不影响主工程的运行。
- 分工性提高,不同子工程可由不同人员甚至不同团队负责。
- 代码共享,不同app工程可方便快捷的复用组件。
下面我们就通过pod来创建一个子工程并通过pod在主工程来引入
操作步骤
一、创建子工程
- 使用
Xcode
新建一个工程例如叫HomeModule
- 常常我们会再创建一个Demo项目来做示例,这里我们可以在HomeModule目录下创建一个名为
HomeModuleDemo
的工程 - 为了方便起见,在HomeModule目录下创建一个名为
Classes
的文件夹,将需要导出的代码类都放在这个文件夹下,建立一个Resources
文件夹,将需要导出的资源文件放在这个目录下 - cd到HomeModule工程目录,输入命令
pod spec create HomeModule
,这段命令会在目录下生成HomeModule.podspec
文件,这个文件其实就是对这个工程的描述,例如工程名称、托管地址、需要导出哪些文件等
下面是进行到这一步的目录示例图
-
好了,现在可以先将这个项目托管到线上git仓库
-
打开
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库
- 开发HomeModule模块,添加新功能
- 将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仓库:
通过命令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 update
和pod setup
都非常慢,这两个命令都会更新这个仓库,大家可以将master仓库的url切换为清华大学的cocoapods官方spec镜像源,具体详见清华大学软件源
好了,了解完官方spec仓库后,我们可以开始创建自己的spec仓库了。
- 直接在gitlab或是github上创建一个空仓库名为xxxPodSpecs
- 将这个仓库clone到本地的
.cocoapod/repos/xxxPodSpecs
,当然这里使用pod命令行工具来执行,pod repo add xxxPodSpecs https://github/xxx/xxxPodSpecs.git
,执行完成后再执行pod repo list
就可以看到我们私有的spec仓库在列了。 - 将我们的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 的切换
三、主工程集成
- 打开我们的主工程的
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开发新的功能后,我们需要更新我们的版本,具体操作如下
- 将HomeModule项目新代码push到git仓库,并且创建0.0.2的tag
- 修改HomeModule.podspec的s.version为0.0.2
- cd到HomeModule.podspec目录执行
pod repo push xxxPodSpecs HomeModule.podspec --allow-warnings
- 主工程的
podfile
更新为
pod 'HomeModule', '0.0.2'
- 主工程执行
pod install
扩展
Demo工程配置
通常我们会通过一个demo工程来给他人演示库的一些用法,首先我们需要将demo工程通过pod集成我们的HomeMoudle
cd
到HomeModuleDemo
目录,执行pod init
创建一个podfile
。编辑podfile
文件添加HomeModuel
引入
target 'HomeModuleDemo' do
pod 'HomeModule', :path => '../'
end
这里我们通过:path => '../'
直接指向本地的HomeModule.spec
地址即可。
pod install
- 打开
HomeMoudleDemo.xcworkspace
,开始编写示例代码。
谢谢
好了,大致的操作步骤就这些,文章中哪些地方不够详细或者错误的,欢迎各位看官指正出来,谢谢🙏