iOS组件化

参考iOS组件化

一、新建壳工程

1、首先新创建一个空项目作为壳项目,如LZDemo
2、创建podfile文件,执行

pod init

LZDemo中会多一个podfile文件


截屏2021-04-28 下午2.10.17.png

3、创建xworkspace

pod install

LZDemo中会多一个xworkspace文件


截屏2021-04-28 下午2.14.36.png

4、创建一个Lib(自己起的名字)文件,用来存放组件

截屏2021-04-28 下午2.15.52.png

5、然后cd到Lib文件下,创建一个TRUNetworking(自己起的名字)工程,这个就是组件

pod lib create TRUNetworking

然后会出现下面的问题,照着回答就行


6879404-18fa2b3b4b345d53.png

6、打开新建的TRUNetworking文件里的Example,可以看到Pods-->Development Pods--->TRUNetworking里有一个ReplaceMe.m文件。意思就是替换我,可以将需要对外提供的文件替换掉ReplaceMe.m.


6879404-e3b342a5d0973c96.png

7、如新建TRUNetworking文件,替换ReplaceMe.m文件
截屏2021-04-28 下午2.35.41.png

8、之后cd到Lib/TRUNetworking/Example/文件目录下,执行

pod install

可以看到这个时候在Development Pods文件下会多出这两个文件,这就是本地开发的pods文件

6879404-ac071d6e64431143.png

而Podfile的内容其实是
pod 'TRUNetworking', :path => '../'
说明他获取的是本地路径

然后删除Example for TRUNetworking里面的TRUNetworking类,不然运行会因为类重复报错。
至此,一个组件的本地库就创建完成了。

二、壳工程使用本地组件库
首先cd到壳工程LZDemo目录下,修改LZDemo的Podfile文件,增加
pod 'TRUNetworking', :path => 'Lib/TRUNetworking'

6879404-e26fefb7943bcd1c.png

执行

pod install

这样壳工程就pod到本地组件库的内容了,原理跟使用平时的第三方远程库一样。只不过这次使用的是本地的。只不过本地的pod放在了Development Pods文件夹里面,这个文件夹里的内容其实是可以修改的,修改后立刻生效,会比远程pod需要提交版本号,本地再pod对应的版本号方便得多。

我们再用同样方法创建另一个本地工程,登录模块TRULogining
但是这个模块需要依赖TRUNetworking,所以我们得在两个地方添加依赖

6879404-478be7b713924a5f.png
6879404-42e1967245a8430b.png

由于依赖的TRUNetworking在更上一层的文件中,所以需要../../
执行

pod install

之后应该能看到Development Pods里已经有2个文件夹了

6879404-d3ed1dcd65822911.png

这个时候就可以import里面的类,在本地使用了。

三、关联git

完成了本地pod依赖,但是我们肯定不会是个人开发,否则弄这个组件化的意义也不大,所以我们首先得提交到远程,一般公司里都会搭建私有仓库诸如GitLab,这里就拿GitHub来做演示。

1)提交壳工程到远程
首先,在Github上Create a new repository

6879404-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后面的链接是你自己创建的仓库的链接

git remote add origin https://github.com/liuzhao/LZDemo.git

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

git push origin master -f

刷新一下Github上的LZDemo,会看到已经提交上去了

6879404-d22579c483f5a634.png

2、提交子工程到远程(建议不要使用TRUNetworking和TRULogining作为仓库名,因为很多参考过这篇文章的去做组件库的,都是用的这两个名字,cocopoads已经有多个TRUNetworking 和TRULogining 的三方库,下面pod search时会查询出许多这两个名字的第三方)

6879404-b0bab57d85749ef6.png

使用跟提交主工程一样的做法,分别在Github上Create a new repository,然后把他们关联起来

唯一和壳工程不同的是,他们是组件,需要对外提供依赖关系。所以我们还得多做一步操作,那就是增加podspec文件。
以TRUNetworking为例,cd到TRUNetworking目录下,执行

git tag 0.1.0
git push --tags

刷新一下Github上的地址,会看到多了一个分支

6879404-34ed0160f138c74b.png

这个tag分支就是将来提供给别人依赖的版本号分支,有了它,别人使用你的组件的时候就可以根据版本号来控制了。

接下来,使用trunk方式将代码发布到CocoaPods上
首先先编辑一下podspec文件

6879404-2aa9476dde0ee4e7.png

改好后,在上传之前,最好先本地检查一下podspec是否合法

执行下面语句

pod lib lint --verbose
6879404-71025616dcb06a8b.png

如果出现passed validation,说明通过,可以提交到cocoapods上了
执行

我执行完上面的语句后,报错,提示有一个问题没有解决
解决方案是
验证podspec,参考制作Cocoapods管理自己的类库

pod spec lint podspec名称.podspec  --allow-warnings

执行完上面的语句后,如果出现passed validation,说明验证通过,继续执行下面的操作

pod trunk push TRUNetworking.podspec --verbose

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

rm ~/Library/Caches/CocoaPods/search_index.json

再执行

pod search
6879404-35f17bcdb9598c1b.png

这样,本地库就会变成远程库,我壳工程的podfile文件就可以改成
pod 'TRUNetworking',而不再需要后面的path了

6879404-8366f2b9d0992573.png

重新对壳工程LZDemo进行pod install之后,会发现,原来的TRUNetworking文件已经从Development Pods里跑到Pods里去了

6879404-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、Xcode --File--New--Project


截屏2021-04-28 下午6.01.07.png

2、选择Static Library


截屏2021-04-28 下午6.01.47.png

三、子工程调用壳工程pod的第三方库

3、创建的工程文件,要和壳工程同级

截屏2021-04-28 下午6.04.53.png

在podfile文件中为子工程添加要引入的第三方
4、使用Static Library创建的工程,是一个静态库,里面会有.a文件
刚创建 .a文件可能是红色的,不用担心
截屏2021-04-28 下午6.06.48.png

5、建立工程间的编联关系
选中壳工程,选择General---Frameworks,Libraries,and Embedded Content,添加子工程的.a文件,如下图的libMYSDK.a
截屏2021-04-28 下午6.09.16.png

这样,壳工程就可以使用子工程的文件了。
6、为子工程pod壳工程中的第三方

截屏2021-04-28 下午5.52.03.png

为子工程添加第三方后,一定要执行pod install,只要对podfile做了修改 就要执行pod install。
至此,子工程可以使用壳工程导入的第三方库

你可能感兴趣的:(iOS组件化)