一、新建工程 GSComponent 作为壳工程
1、添加Podfile文件
cd 到你刚创建的工程目录下,执行以下语句
pod init
然后会发现你的工程目录下多了 Podfile 文件
2、生成 xcworkspace 工程
执行
pod install
3、新建一个Lib(自己起名)文件夹,用来存放组件库(其他独立工程)
然后 cd 到 Lib 下
执行
pod lib create GSNetworking
其中 GSNetworking 就是你自定义的一个工程名字,也就是你的其中一个组件或者业务模块
iOS ~> ObjC ~> Yes ~> None ~> Yes ~> GS
然后根据提示,生成 pod 工程模板
打开新建的 GSNetworking 工程里的 Example,可以看到 pods 里面,有个 ReplaceMe 的文件,意思就是要替换它,换成我们自己需要对外提供的类。
新建一个类,比如 GSNetworking,复制粘贴到 ReplaceMe 同级目录下,并删掉 ReplaceMe.m 文件
之后 cd 到 Lib/GSNetworking/Example/ 文件目录下,执行
pod install
这个时候在 Development Pods 文件下会多出这两个文件,这就是本地开发的 pods 文件
而 Podfile 的内容其实是
pod 'GSNetworking', :path => '../'
说明他获取的是本地路径
然后删除 Example for GSNetworking 里面的 GSNetworking 类,不然运行会因为类重复报错。
至此,一个组件的本地库就创建完成了。
二、壳工程使用本地组件库
首先 cd 到壳工程 GSComponent 目录下,修改 GSComponent 的 Podfile 文件,增加
pod 'GSNetworking', :path => 'Lib/GSNetworking'
执行
pod install
这样壳工程就 pod 到本地组件库的内容了,原理跟使用平时的第三方远程库一样。只不过这次使用的是本地的。只不过本地的 pod 放在了 Development Pods 文件夹里面,这个文件夹里的内容其实是可以修改的,修改后立刻生效,会比远程 pod 需要提交版本号,本地再 pod 对应的版本号方便得多。
我们再用同样方法创建另一个本地工程,登录模块 GSLogining
但是这个模块需要依赖 GSNetworking,所以我们得在两个地方添加依赖
由于依赖的 GSNetworking 在更上一层的文件中,所以需要../../
执行
pod install
之后应该能看到 Development Pods 里已经有2个文件夹了
这个时候就可以 import 里面的类,在本地使用了。
三、关联 git
完成了本地 pod 依赖,但是我们肯定不会是个人开发,否则弄这个组件化的意义也不大,所以我们首先得提交到远程,一般公司里都会搭建私有仓库诸如GitLab,这里就拿 GitHub 来做演示。
1)提交壳工程到远程
首先,在 GitHub 上 Create a new repository
然后,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,会看到已经提交上去了
2)提交子工程到远端
使用跟提交主工程一样的做法,分别在 GitHub 上 Create a new repository,然后把他们关联起来
唯一和壳工程不同的是,他们是组件,需要对外提供依赖关系。所以我们还得多做一步操作,那就是增加 podspec 文件。
以 GSNetworking 为例,cd 到 GSNetworking 目录下,执行
git tag 0.1.0
git push --tags
刷新一下 GitHub 上的地址,会看到多了一个 release
这个 tag 分支就是将来提供给别人依赖的版本号分支,有了它,别人使用你的组件的时候就可以根据版本号来控制了。
接下来,使用 trunk 方式将代码发布到 CocoaPods 上
首先先编辑一下 podspec 文件
因为是 Networking 我们这里会依赖 AFNetworking,所以顺带打开默认被注释的
s.dependency 'AFNetworking', '~> 2.3'
改好后,在上传之前,最好先本地检查一下 podspec 是否合法
执行下面语句
pod lib lint GSNetworking.podspec --verbose
如果出现 passed validation,说明通过,可以提交到 cocoapods 上了
在进行 trunk 操作 push 到 cocoapods 上前可以进行邮箱的注册来防止后面遇到邮箱相关的问题错误
执行命令:pod trunk register '[email protected]' 'Gavin' --description='MackBook Pro'
在自己邮箱里面去点击,那个邮件里面的连接,就可以了(如果找不到那个邮件,多等个几分钟的。或着去垃圾箱中找找,有可能是腾讯把他等垃圾邮件了)
执行
pod trunk push GSNetworking.podspec --verbose
成功后,就可以 pod search 到我们提交的库了
ps:如果搜不到,不是没传成功,是我们的本地搜索库没更新,可以先删除~/Library/Caches/CocoaPods 目录下的 search_index.json 文件或者 pod repo update 一下
终端执行
rm ~/Library/Caches/CocoaPods/search_index.json
再执行
pod search GSNetworking
这样,本地库就会变成远程库,我壳工程的 podfile 文件就可以改成
pod 'GSNetworking',而不再需要后面的 path 了
重新对壳工程 GSComponent 进行 pod install 之后,会发现,原来的 GSNetworking 文件已经从 Development Pods 里跑到 Pods 里去了
一些注意点:
1)如果 pod trunk push 上去的 podspec 文件,如果有依赖库,这个依赖库必须是在 cocoapods 上,即使是不能依赖本地库,而是远程库。所以说,比如刚才创建的 GSNetworking 和 GSLogining,如果要发布GSLogining 到 cocoapods,但是由于 GSLogining 是依赖于 GSNetworking 的,所以要首先将 GSNetworking 提上到 cocoapods 上,否则 GSLogining是提不上去的。
2)由于壳工程和子工程都有独立存在的 git,所以别人从壳工程的 git 地址 clone 下来的工程,是没有子工程的存在的。如果想运行起来壳工程,要么是所有的子工程都已经提到 cocoapods 上,要么是拿到子工程的 git 地址,checkout 到本地壳工程的 Lib 库下。
3)如果你不想每建立一个子工程,都要到 Github 或者 GitLab 上创建一个 repository 的话,又想把子工程 push 到壳工程的 git 上的话,可以先把子工程里的 git 删除,这样 push 上的壳工程代码,就会带上子工程了,等你需要单独管理子工程的时候,再把 git 加回去即可。