随着当前项目中的业务越来越多,代码无疑会特别的多,这样我们编译速度会变得特别的慢,所以大型项目中都会用到组件化,将代码剥离出来,封装成组件。组件化在当前大型的项目中运用越来越多,所以自己就试着封装了一些组件,包括基础组件/功能组件和业务组件,总结了一下组件化的大体流程,以基础组件为例。
1.创建spec本地的repo文件(本地索引库)
为什么要创建一个本地的索引库那?其实是因为当我们用cocopods安装我们自己的私有库时,cocopods首先在本地的索引库(用户名/.cocopods/repos)中查找有没有我们想要安装私有库对应的.podspec文件,在podspec文件中保存着我们的私有库地址及依赖库等描述信息,如果查找到了,就会从git上下载
下面先创建一个属于自己的spec文件用于存放我们私有库的索引
按照我们的配置选项点击创建,就完成了。注意要选择忽略的类型,要么最后往本地spec私有库索引提交的时候会报私有库为空不能pull的错误.
在终端中,我们把我们创建的私有spec添加到本地代码中,可以按照下图中的命令首先进入pod repo 查看本地的spec索引有哪些,如果之间没有创建过私有spec,应该只有master 这一项;接下来我们添加自己的索引库地址到本地repos中,pod repo add 名称 索引库地址,执行命令之后会发现在本地索引库中存在了一个自己的spec,创建完成。
在本地可以查看
2.创建一个本地的pod测试代码
我们首先需要在coding.net中创建存放私有库的远端项目,在这里能查看我们的存放到托管平台中的代码以及版本信息和提交记录。项目的创建和创建spec本地的repo文件方法一样,只是我们不用设置.gitignore文件,创建完之后我们会获取当前的代码地址和托管平台地址,复制下来,接下来的代码中会用到。
接下来,开始在本地创建我们的私有库项目:
1.pod lib create 私有库名称,会创建一个私有库的项目,项目中主要存在一个xxx.podspec和一个常规项目(AppDelegate/ViewController等)以及存放我们想要生成私有库代码的Development Pods文件
2.找到Development Pods中ReplaceMe.h中对应的位置(会发现存在一个classes文件夹,放到这个文件夹里边),删除ReplaceMe.h,如果有图片资源的话,一般情况我们是推荐放到自己的私有库中进行管理的,存放图片资源/文件/其他资源是在当前classes文件夹的同级目录Assets中
拖进去代码之后会发现图中的ReplaceMe.m找不到引用,我们将其删除
到这里我们把项目代码以及项目中的资源文件都放到了私有库项目中了.
3.接下来修改podSpec文件,这个文件存放了很多我们的远程私有库路径以及当前的版本等记录。主要是下边这几项:
s.homepage = 'https://coding.net/u/XXX/p/WKFMBases' -放到coding.net中的显示地址
s.source = { :git => 'https://git.coding.net/XXX/WKFMBases.git', :tag => s.version.to_s } - 放到托管平台的地址以及tag版本
# s.resource_bundles = { -如果包含图片,我们需要打开这个配置,才能找到图片
# 'WKFMBases' => ['WKFMBases/Assets/*']
# }
#s.source_files = 'WKFMBases/Classes/**/*' - 当我们引用的库作为一个整体,并不区分功能时可以这么写,下面的subspec其实是可以分模块引用的意思
s.subspec 'Category' do |category|
category.source_files = 'WKFMBases/Classes/category/**/*'
end
s.subspec 'NetWork' do |network|
network.source_files = 'WKFMBases/Classes/NetWork/**/*'
network.dependency 'AFNetworking'
end
注意几个问题:
(1)、如果依赖的是系统的库比如sqlite3,那么应该添加 s.library = "sqlite3"
(2)、如果我们组件中用到了一些图片或者其他类型的资源,需要引入资源包s.resource_bundles
(3)、在创建基础组件库的时候,如果允许对库中的某一个单独的模块进行引用,那么我们可以设置s.subspec,这样就可以让引用者对我们的基础组件进行单独某个模块的调用了
(4)、如果私有库项目中有依赖比如AFN这种框架或者我们自己的私有库,首先进行pod install,只需要在Podfile添加我们的source源就行,不需要另外加pod ''
(5)、比如我们要引用一个xib的类,通过bundle进行调用,不能通过[NSBundle MainBundle]进行调用,MainBundle就表示我们的宿主工程,但是我们的xib文件其实在我们的组件私有库中以nib的格式存放,所以我们需要找到私有库的bundle地址,[NSBundle bundleForClass:[self class]] 这样我们就找到了当前的bundle
(6)、图片(或者音视频资源)资源放到我们的私有库中,否则我们加载的时候需要到宿主工程中去寻找,私有库中Assets和Classes是存在于同一级目录下的,我们把想要的资源都放到Assets中,然后配置资源的路径,否则图片资源寻找的时候路径根本找不到;在调用image时不能用imageNamed:,因为其路径是基于宿主工程的,所以我们需要获取图片路径,用contentOfFile进行加载,生成路径的时候我们还是用[NSBundle bundleForClass:[self class]],由于资源文件是放在bundle下的一个资源文件中,所以我们需要在当前bundle中添加一个子路径currentBundle.infoDictionary[@"CFBundleName"],具体的图片资源需要输入图片的全名[email protected]
(7)、xib中的图片地址:当我们把xib放入私有库的时候,会发现图片资源找不到的问题,我们可以在xib的图片名称前面加上当前资源文件所在的地址,也就是currentBundle.infoDictionary[@"CFBundleName"]名字
接下来私有库的本地项目配置完毕,我们可以编译或者运行一下,看看我们的私有库是否有错,比如我们创建的私有库是放到基础组件那么直接编译就行判断是否报错就行,如果是业务或者功能型的私有库能展示出图形界面的,我们可以在appDelegatge中配置一下,展示出我们的私有库信息就判断出私有库配置正确了;解析来进行下一步提交
3.添加工程到.git暂缓目录下,并提交到本地git仓库
git add . 提交到本地暂缓目录
git status 本地暂缓目录的查看
git commit -m ‘xxxx’ 提交到本地仓库
提交到远程仓库
git remote add origin 地址 git远程仓库的关联
git remote 查看远程仓库地址,如果没有就不反回
git push origin master 把本地仓库的内容推到远程git仓库(如果提示
git无法pull仓库refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories
刚创建的仓库需要同步远程的master,将远端的代码先进行pull操作,然后再执行上边的语句 git push origin master,或者出现了下图中需要进行pull操作的)
整体的代码如下
设置tag 以及删除tag
git tag 查看tag记录
git tag -a '0.0.1' -m '打标签' 添加标签(注意创建的tag必须有和version一致,否则会找不到对应的branch)
git push --tags 推送到远程仓库
git tag -d 0.01 删除本地tag
git push origin :0.01 删除本地之后讲远程tag删除
部分图中的代码是失效的
进行本地的验证
本地验证是进行判断是否podSpec文件中或者私有库中格式或者路径信息是否正确,比如podspec中的homepage/ s.source或者filesource的路径是否正确
远程验证
pod spec lint
提交到远程私有索引库,这样当其他人想用我们索引库的时候,只需要提供给我们公钥,配置到coding.net中,通过在podfile中添加上我们的spec地址,根据spec中的地址找到我们的私有库
pod repo push 本地私有索引库名称 本地库名称.podspec
这就是所有的私有库的组件化流程了,在宿主工程中pod进行组件安装的时候,必须在podfile中添加私有库的托管地址,从而在私有库中找到对应的代码。
遇到的问题:
1.当遇到多个私有库中的spec文件需要放到同一个repo的文件路径下(前提是本地已经有了存放私有spec文件的repo文件),我们可以输入命令
pod repo push USER_SPECS PRIVATE_PODSPEC --verbose --use-libraries --allow-warnings
USER_SPECS:是用户创建的私有的specs名称,用来存放私有的所有spec文件
PRIVATE_PODSPEC:私有库中的.podspec文件名称,比如:wk.podspec
2.遇到私有库中包含xib的错误
Unable to run command 'StripNIB BaseAuthViewController~ipad.nib' - this target might include its own product.
其实是xib文件路径并没有在.podspec文件中正确设置
比如改正之前
xib文件算是资源文件的,需要另外添加.resource引入
3.当push 提交到远程私有索引库
pod repo push 本地私有索引库名称 本地库名称.podspec 的时候,报错
更新私有库版本时,出现 [!] The repo MySpecs at ../../../../.cocoapods/repos/MySpecs is not clean, 需要更新一下我们的索引库:
执行 pod repo update 本地私有索引库名称
4.当我们在创建的私有库podspec中引用另外一个私有库时,校验podspec文件 pod spec lint发现
引用的私有库中并有检索到另外的ios-lib-tink的spec,这个时候我们需要将私有库的索引地址和master库索引地址添加到pod spec lint 中
执行命令 pod spec lint --sources='私有索引库地址,https://github.com/CocoaPods/Specs'
5.注意创建的tag必须和我们的version一致,否则在最后提交远程spec文件的时候,会发现找不到对应的branch