iOS 组件化
一、新建工程LZDemo作为壳工程
1、添加Podfile文件
cd到你刚创建的工程目录下,执行以下语句
pod init
然后会发现你的工程目录下多了Podfile文件
![](https://img.haomeiwen.com/i6879404/d8f46527b88592d2.png)
2、生成xcworkspace工程
执行
pod install
3、新建一个Lib(自己起名)文件夹,用来存放组件库(其他独立工程)
![](https://img.haomeiwen.com/i6879404/f9a9cceede6ed972.png)
然后cd到Lib下
执行
pod lib create TRUNetworking
其中TRUNetworking就是你自定义的一个工程名字,也就是你的其中一个组件或者业务模块
![](https://img.haomeiwen.com/i6879404/18fa2b3b4b345d53.png)
然后根据提示,生成pod工程模板
![](https://img.haomeiwen.com/i6879404/ff3ecf03d141169b.png)
打开新建的TRUNetworking工程里的Example,可以看到pods里面,有个ReplaceMe的文件,意思就是要替换它,换成我们自己需要对外提供的类。
![](https://img.haomeiwen.com/i6879404/e3b342a5d0973c96.png)
新建一个类,比如TRUNetworking,复制粘贴到ReplaceMe同级目录下,并删掉ReplaceMe.m文件
![](https://img.haomeiwen.com/i6879404/72339b8df4f63eaa.png)
之后cd到Lib/TRUNetworking/Example/文件目录下,执行
pod install
这个时候在Development Pods文件下会多出这两个文件,这就是本地开发的pods文件
![](https://img.haomeiwen.com/i6879404/ac071d6e64431143.png)
而Podfile的内容其实是
pod 'TRUNetworking', :path => '../'
说明他获取的是本地路径
然后删除Example for TRUNetworking里面的TRUNetworking类,不然运行会因为类重复报错。
至此,一个组件的本地库就创建完成了。
二、壳工程使用本地组件库
首先cd到壳工程LZDemo目录下,修改LZDemo的Podfile文件,增加
pod 'TRUNetworking', :path => 'Lib/TRUNetworking'
![](https://img.haomeiwen.com/i6879404/e26fefb7943bcd1c.png)
执行
pod install
![](https://img.haomeiwen.com/i6879404/7d8bc2867f0b28f2.png)
这样壳工程就pod到本地组件库的内容了,原理跟使用平时的第三方远程库一样。只不过这次使用的是本地的。只不过本地的pod放在了Development Pods文件夹里面,这个文件夹里的内容其实是可以修改的,修改后立刻生效,会比远程pod需要提交版本号,本地再pod对应的版本号方便得多。
我们再用同样方法创建另一个本地工程,登录模块TRULogining
但是这个模块需要依赖TRUNetworking,所以我们得在两个地方添加依赖
![](https://img.haomeiwen.com/i6879404/478be7b713924a5f.png)
![](https://img.haomeiwen.com/i6879404/42e1967245a8430b.png)
由于依赖的TRUNetworking在更上一层的文件中,所以需要../../
执行
pod install
之后应该能看到Development Pods里已经有2个文件夹了
![](https://img.haomeiwen.com/i6879404/d3ed1dcd65822911.png)
这个时候就可以import里面的类,在本地使用了。
三、关联git
完成了本地pod依赖,但是我们肯定不会是个人开发,否则弄这个组件化的意义也不大,所以我们首先得提交到远程,一般公司里都会搭建私有仓库诸如GitLab,这里就拿GitHub来做演示。
1)提交壳工程到远程
首先,在Github上Create a new repository
![](https://img.haomeiwen.com/i6879404/252703f85d33a61d.png)
然后,cd回壳工程目录下,依次执行
git init
初始化git
git add .
执行git add .的时候,会发现警告warning: adding embedded git repository: Lib/TRULogining之类的,是因为TRULogining目录下有它自己的git仓库,它俩是独立存在的,有另外一个git仓库专门管理他,因为它也是一个完整的独立工程,这里我们先忽略它。
然后,提交初始化工程
git commit -m "init project"
接下来,我们要让这个工程和刚才在Github上创建的Repository关联
git remote add origin https://github.com/liuzhao/LZDemo.git
git branch -M main
git push -u origin main
刷新一下Github上的LZDemo,会看到已经提交上去了
![](https://img.haomeiwen.com/i6879404/d22579c483f5a634.png)
2)提交子工程到远端
![](https://img.haomeiwen.com/i6879404/b0bab57d85749ef6.png)
和提交主工程一样的做法,分别在Github上Create a new repository,然后把他们关联起来
唯一和壳工程不同的是,他们是组件,需要对外提供依赖关系。所以我们还得多做一步操作,那就是增加podspec文件。
以TRUNetworking为例,cd到TRUNetworking目录下,执行
git tag 0.1.0
git push --tags
刷新一下Github上的地址,会看到多了一个分支
![](https://img.haomeiwen.com/i6879404/34ed0160f138c74b.png)
这个tag分支就是将来提供给别人依赖的版本号分支,有了它,别人使用你的组件的时候就可以根据版本号来控制了。
接下来,使用trunk方式将代码发布到CocoaPods上
首先先编辑一下podspec文件
![](https://img.haomeiwen.com/i6879404/2aa9476dde0ee4e7.png)
改好后,在上传之前,最好先本地检查一下podspec是否合法
执行下面语句
pod lib lint --verbose
或
pod lib lint --allow-warnings --verbose
![](https://img.haomeiwen.com/i19689478/c8f1ce68a95d8e24.png)
如果出现passed validation,说明通过,可以提交到cocoapods上了
接着你需要注册⼀个trunk账号:
pod trunk register '邮箱' '昵称'
成功之后会有让你打开邮箱进⾏
验证的提示,打开你的邮箱点击链接进⾏验证。
验证之后,
输⼊:pod trunk me
进⾏验证,看是否激活成功。
执行
pod trunk push TRUNetworking.podspec --verbose
或
pod trunk push TRUNetworking.podspec --allow-warnings(可能需要⼀会)
![](https://img.haomeiwen.com/i19689478/dc8ad838025dfd02.png)
成功后,就可以pod search到我们提交的库了
ps:如果搜不到,不是没传成功,是我们的本地搜索库没更新,可以先删除~/Library/Caches/CocoaPods目录下的search_index.json文件或者pod repo update一下
终端执行
rm ~/Library/Caches/CocoaPods/search_index.json
再执行
pod search
![](https://img.haomeiwen.com/i6879404/35f17bcdb9598c1b.png)
这样,本地库就会变成远程库,我壳工程的podfile文件就可以改成
pod 'TRUNetworking',而不再需要后面的path了
![](https://img.haomeiwen.com/i6879404/8366f2b9d0992573.png)
重新对壳工程LZDemo进行pod install之后,会发现,原来的TRUNetworking文件已经从Development Pods里跑到Pods里去了
![](https://img.haomeiwen.com/i6879404/0cea82ca2b7b2ce3.png)
一些注意点:
1)如果pod trunk push上去的podspec文件,如果有依赖库,这个依赖库必须是在cocoapods上,即使是不能依赖本地库,而是远程库。所以说,比如刚才创建的TRUNetworking和TRULogining,如果要发布TRULogining到cocoapods,但是由于TRULogining是依赖于TRUNetworking的,所以要首先将TRUNetworking提上到cocoapods上,否则TRULogining是提不上去的。
2)由于壳工程和子工程都有独立存在的git,所以别人从壳工程的git地址clone下来的工程,是没有子工程的存在的。如果想运行起来壳工程,要么是所有的子工程都已经提到cocoapods上,要么是拿到子工程的git地址,checkout到本地壳工程的Lib库下。
3)如果你不想每简历一个子工程,都要到Github或者GitLab上创建一个repository的话,又想把子工程push到壳工程的git上的话,可以先把子工程里的git删除,这样push上的壳工程代码,就会带上子工程了,等你需要单独管理子工程的时候,再把git加回去即可。
版本更新
1.代码更新
cd 项目的目录
git init
git add .
查看代码的修改
git status
//modified 标示修改的文件
//deleted标示删除的文件
// untracked files 未处理的文件 需要执行 git add方法添加上去
提交代码
git commit -m ‘注释’ 注意添加注释
同步代码
git pull
把代码推到服务器上
git push origin
git tag 0.1.0(最新的版本)
git push --tags
pod lib lint --allow-warnings --verbose
pod trunk push TRUNetworking.podspec --allow-warnings