iOS|iOS 组件化 CocoaPods操作

一、新建工程 GSComponent 作为壳工程
1、添加Podfile文件 cd 到你刚创建的工程目录下,执行以下语句

pod init

然后会发现你的工程目录下多了 Podfile 文件
iOS|iOS 组件化 CocoaPods操作
文章图片
2、生成 xcworkspace 工程 执行
pod install

3、新建一个Lib(自己起名)文件夹,用来存放组件库(其他独立工程) iOS|iOS 组件化 CocoaPods操作
文章图片
然后 cd 到 Lib 下
执行
pod lib create GSNetworking

其中 GSNetworking 就是你自定义的一个工程名字,也就是你的其中一个组件或者业务模块
iOS|iOS 组件化 CocoaPods操作
文章图片
iOS ~> ObjC ~> Yes ~> None ~> Yes ~> GS
然后根据提示,生成 pod 工程模板
iOS|iOS 组件化 CocoaPods操作
文章图片
打开新建的 GSNetworking 工程里的 Example,可以看到 pods 里面,有个 ReplaceMe 的文件,意思就是要替换它,换成我们自己需要对外提供的类。
iOS|iOS 组件化 CocoaPods操作
文章图片
新建一个类,比如 GSNetworking,复制粘贴到 ReplaceMe 同级目录下,并删掉 ReplaceMe.m 文件
iOS|iOS 组件化 CocoaPods操作
文章图片
之后 cd 到 Lib/GSNetworking/Example/ 文件目录下,执行
pod install

这个时候在 Development Pods 文件下会多出这两个文件,这就是本地开发的 pods 文件
iOS|iOS 组件化 CocoaPods操作
文章图片
而 Podfile 的内容其实是
pod 'GSNetworking', :path => '../'
说明他获取的是本地路径
然后删除 Example for GSNetworking 里面的 GSNetworking 类,不然运行会因为类重复报错。
至此,一个组件的本地库就创建完成了。
二、壳工程使用本地组件库
首先 cd 到壳工程 GSComponent 目录下,修改 GSComponent 的 Podfile 文件,增加
pod 'GSNetworking', :path => 'Lib/GSNetworking'
iOS|iOS 组件化 CocoaPods操作
文章图片
执行
pod install

iOS|iOS 组件化 CocoaPods操作
文章图片
这样壳工程就 pod 到本地组件库的内容了,原理跟使用平时的第三方远程库一样。只不过这次使用的是本地的。只不过本地的 pod 放在了 Development Pods 文件夹里面,这个文件夹里的内容其实是可以修改的,修改后立刻生效,会比远程 pod 需要提交版本号,本地再 pod 对应的版本号方便得多。
我们再用同样方法创建另一个本地工程,登录模块 GSLogining
但是这个模块需要依赖 GSNetworking,所以我们得在两个地方添加依赖
iOS|iOS 组件化 CocoaPods操作
文章图片
iOS|iOS 组件化 CocoaPods操作
文章图片
由于依赖的 GSNetworking 在更上一层的文件中,所以需要../../
执行
pod install

之后应该能看到 Development Pods 里已经有2个文件夹了
iOS|iOS 组件化 CocoaPods操作
文章图片
这个时候就可以 import 里面的类,在本地使用了。
三、关联 git
完成了本地 pod 依赖,但是我们肯定不会是个人开发,否则弄这个组件化的意义也不大,所以我们首先得提交到远程,一般公司里都会搭建私有仓库诸如GitLab,这里就拿 GitHub 来做演示。
1)提交壳工程到远程 首先,在 GitHub 上 Create a new repository
iOS|iOS 组件化 CocoaPods操作
文章图片
然后,cd 回壳工程目录下,依次执行
git init

初始化 git
git add .

执行 git add . 的时候,会发现警告 warning: adding embedded git repository: Lib/GSLogining 之类的,是因为 GSLogining 目录下有它自己的 git 仓库,它俩是独立存在的,有另外一个 git 仓库专门管理他,因为它也是一个完整的独立工程,这里我们先忽略它。
然后,提交初始化工程
git commit -m "init project"

接下来,我们要让这个工程和刚才在 GitHub 上创建的 Repository 关联
git remote add origin https://github.com/GSNICE/GSComponent.git

然后,提交初始化工程到远端的 master,这里我们用了-f,表示强制提交,否则因为 GitHub 上还有 README 之类的文件,需要解决冲突再 pull,比较麻烦,基于是初始工程,直接强制 push 上去即可。
git push origin master -f

刷新一下 GitHub 上的 GSComponent,会看到已经提交上去了
iOS|iOS 组件化 CocoaPods操作
文章图片
image.png 2)提交子工程到远端 使用跟提交主工程一样的做法,分别在 GitHub 上 Create a new repository,然后把他们关联起来
唯一和壳工程不同的是,他们是组件,需要对外提供依赖关系。所以我们还得多做一步操作,那就是增加 podspec 文件。
以 GSNetworking 为例,cd 到 GSNetworking 目录下,执行
git tag 0.1.0 git push --tags

刷新一下 GitHub 上的地址,会看到多了一个 release
iOS|iOS 组件化 CocoaPods操作
文章图片
这个 tag 分支就是将来提供给别人依赖的版本号分支,有了它,别人使用你的组件的时候就可以根据版本号来控制了。
接下来,使用 trunk 方式将代码发布到 CocoaPods 上
首先先编辑一下 podspec 文件
iOS|iOS 组件化 CocoaPods操作
文章图片
因为是 Networking 我们这里会依赖 AFNetworking,所以顺带打开默认被注释的
s.dependency 'AFNetworking', '~> 2.3'
改好后,在上传之前,最好先本地检查一下 podspec 是否合法
执行下面语句
pod lib lint GSNetworking.podspec --verbose

iOS|iOS 组件化 CocoaPods操作
文章图片
如果出现 passed validation,说明通过,可以提交到 cocoapods 上了
在进行 trunk 操作 push 到 cocoapods 上前可以进行邮箱的注册来防止后面遇到邮箱相关的问题错误
  1. 执行命令:pod trunk register 'sdjngcb@gmail.com' 'Gavin' --description='MackBook Pro'
  2. 在自己邮箱里面去点击,那个邮件里面的连接,就可以了(如果找不到那个邮件,多等个几分钟的。或着去垃圾箱中找找,有可能是腾讯把他等垃圾邮件了)
执行
pod trunk push GSNetworking.podspec --verbose

iOS|iOS 组件化 CocoaPods操作
文章图片
成功后,就可以 pod search 到我们提交的库了
ps:如果搜不到,不是没传成功,是我们的本地搜索库没更新,可以先删除~/Library/Caches/CocoaPods 目录下的 search_index.json 文件或者 pod repo update 一下
终端执行
rm ~/Library/Caches/CocoaPods/search_index.json

再执行
pod search GSNetworking

iOS|iOS 组件化 CocoaPods操作
文章图片
这样,本地库就会变成远程库,我壳工程的 podfile 文件就可以改成
pod 'GSNetworking',而不再需要后面的 path 了
iOS|iOS 组件化 CocoaPods操作
文章图片
重新对壳工程 GSComponent 进行 pod install 之后,会发现,原来的 GSNetworking 文件已经从 Development Pods 里跑到 Pods 里去了
iOS|iOS 组件化 CocoaPods操作
文章图片
一些注意点: 1)如果 pod trunk push 上去的 podspec 文件,如果有依赖库,这个依赖库必须是在 cocoapods 上,即使是不能依赖本地库,而是远程库。所以说,比如刚才创建的 GSNetworking 和 GSLogining,如果要发布GSLogining 到 cocoapods,但是由于 GSLogining 是依赖于 GSNetworking 的,所以要首先将 GSNetworking 提上到 cocoapods 上,否则 GSLogining是提不上去的。
2)由于壳工程和子工程都有独立存在的 git,所以别人从壳工程的 git 地址 clone 下来的工程,是没有子工程的存在的。如果想运行起来壳工程,要么是所有的子工程都已经提到 cocoapods 上,要么是拿到子工程的 git 地址,checkout 到本地壳工程的 Lib 库下。
【iOS|iOS 组件化 CocoaPods操作】3)如果你不想每建立一个子工程,都要到 Github 或者 GitLab 上创建一个 repository 的话,又想把子工程 push 到壳工程的 git 上的话,可以先把子工程里的 git 删除,这样 push 上的壳工程代码,就会带上子工程了,等你需要单独管理子工程的时候,再把 git 加回去即可。

    推荐阅读