iOS组件化 (pod私有库,包含静态库)
因项目业务的不断发展,应用的代码体积越来越大,代码耦合也较为严重,所以考虑先对各模块进行解耦,然后通过pod私有库来进行管理,如此每一个模块都可以单独运行。这篇文章就详细介绍如何建立远程pod私有库,以及使用。
创建远程私有库有以下几个步骤:
- 创建一个远程仓库,作为私有的repo索引库
- 创建一个远程仓库,作为我们需要封装的模块组件仓库(存放待封装的项目文件,需要拆分成几个模块就要需要几个仓库,这里以一个为例)
- 添加文件到组件仓库,配置 pod.spec 文件,并上传至pod远程私有库
- 添加tag,并推送至远端私有库(tag要与.podspec文件中的version保持一致)
- 向私有的Repo索引库提交podspec
- pod私有库的使用
- pod私有库的更新
1. 创建两个远程仓库
创建YMSpecRepo远程仓库,用来作为索引库。
创建YMCommonViewLib远程仓库,用来存放项目工程文件。(YMSpecRepo和YMCommonViewLib是我为了让大家看的更清楚设的名字)
2. 创建spec Repo 本地索引
打开终端,在终端切换到 ~/.cocoapods/repos 目录下,然后进行pod repo add repoName http://******* 操作 (repoName为索引库名称,自定义即可,我这里就是YMSpecRepo,后面的链接为刚创建的远程索引库地址)
在终端输入:
这时本地的索引库已经创建好了
本地索引库.png
3. 创建pod私有库的所需的项目工程文件
cd 到一个你需要创建项目的目录下,执行pod lib create YMCommonViewLib
这里应该会提示让你设置几个问题,简单设置下即可
显示成功之后应该会自动打开创建好的项目。
打开下图目录,可删除自动生成的ReplaceMe文件,然后手动拖入项目文件
添加项目文件.png
接下来cd 到Example目录下,执行pod install,如果跳过这一步,会出现很多问题。
image.png
然后就是对podspec文件进行配置,如下图
podspec文件
配置podspec文件
配置podspec文件
主要有name,version,homepage,license,author,source,deployment_target, source_files,依赖库等
注意:homepage和source要设置成创建好的私有库的远程仓库地址,并非索引库的仓库地址
修改完成后,cd 到YMCommonViewLib目录下,即Example所在目录,再次执行pod install,然后验证podspec文件
pod lib lint YMCommonViewLib.podspec //进行本地验证文件有效性。
验证podspec文件
可能会有警告导致失败,说的是描述信息过短,可以在执行时添加跳过警告即可
pod lib lint YMCommonViewLib.podspec --allow-warnings
跳过警告
- 验证及推送常用的补充命令
--allow-warnings //Allows push even if there are lint warnings
--use-libraries //Linter uses static libraries to install the spec
--swift-version=VERSION T//he SWIFT_VERSION that should be used to lint the spec.
This takes precedence over a .swift-version file.
--skip-import-validation //Lint skips validating that the pod can be imported
--skip-tests //Lint skips building and running tests during validation
--silent //Show nothing
--verbose //Show more debugging information
--no-ansi // Show output without ANSI codes
--help // Show help banner of specified command
接下来就要将本地的项目与远端库建立连接,使用git remote add origin 远程仓库地址 // 将本地项目与远程仓库关联
与远程库建立连接
这里推送可能会失败
可能会出现下图情况
image.png
重新输入如下命令:
git pull origin master --allow-unrelated-histories,如果有冲突,就修改下冲突再提交,修改冲突可到sourceTree中修改,较直观,之后就再次提交。
这里先git add . 添加文件跟踪,然后git commit -am "提交" 提交本地暂存,然后再推送远端git push,可能会出现
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
那就根据提示git push --set-upstream origin master
推送远端
推送到远端之后我们还要打tag,具体如下图,不过推荐使用sourceTree,两种方式择其一
挖来的命令行
SourceTree
接着执行 pod spec lint YMCommonViewLib.podspec //命令进行本地和远程验证文件有效性。
注意:
如果私有库中依赖私有库,则验证podspec文件的时候需要加上–sources参数,否则会出现找不到你依赖的私有库。
如果上面打tag关键一步没有做,这里会出现以下问题。
image.png
4.向私有的Repo索引远程仓库中提交podspec
注意还是在刚才私有库组件的目录下,使用 pod repo push YMSpecRepo YMCommonViewLib.podspec 命令把私有库添加到私有repo索引中
向索引远程仓提交podspec
这时候repo里已经有我们刚才创建的私有库了,前往文件夹 ~/.cocoapods/repos查看,0.1.0就是我们刚才打的tag
image.png
这时候使用pod search YMCommonViewLib 已经可以搜索到
私有库搜索
5. pod私有库使用
打开项目的podfile文件
引入 pod 'YMCommonViewLib',并且在podfile最上面要指定source(索引库地址),否则会报找不到的错误,执行pod install之后,在pod文件夹下就可以看到我们自己的私有库了
注意source为索引库的地址,而不是私有库地址,索引库里面已经有了私有库的podspec了。
pod私有库使用6. pod私有库的更新
如果私有库有文件更新,那么就必须要修改podspec文件中的version,同时tag也还是要和version保持一致,然后按之前的方法推送到私有库远端和索引库,否则将会失败。
7. pod私有库包含.a或.framework静态库的处理
如果依赖有静态库,需要像以下方式添加依赖
s.vendored_libraries = 'YMCommonViewLib/Classes/Lib/*.{a}' //该目录下的.a静态库
s.vendored_framework = 'YMCommonViewLib/Classes/Framework/***.framework' //Framework目录下的***.framework静态库
s.static_framework = true //指定pod加静态库标签
包含静态库在做验证和推送到索引库时时也要添加拼接一些命令
pod repo push YMSpecRepo YMCommonViewLib.podspec --allow-warnings --skip-import-validation --use-libraries --verbose
如果依赖的第三方有自己的私有库,在校验的时候需要指定source,后面要添加你索引库的地址
pod lib lint --sources=https://github.com/CocoaPods/Specs.git,http://******/ymspecrepo.git --allow-warnings --verbose --skip-import-validation
8. 私有库的子模块
如果你想引用一个私有库里面的一小部分功能,但是又不想把整个库导入,那么私有库的子模块正和你意
这里举例定义一个宏定义的子模块,里面是一些宏定义文件,外部可单独依赖这个子模块
#子模块的定义,也还是在.podspec文件中
#子模块 —— 宏定义
s.subspec 'Macro' do |submacro|
submacro.source_files = 'YMCommonViewLib/Classes/Macro/*.{h,m}'
end
#使用子模块时只需在podfile中添加 pod 'YMCommonViewLib/Macro' 即可
8. 使用私有库组件开发技巧
在实际项目开发过程中,因为有些私有库在推送到索引库时时间可能会有10-20分钟,频繁的提交到索引库并不现实,而且不适合做私有库版本控制,所以这边建议主工程可依赖私有库的分支,而不是索引库对应的tag版本,到最后项目上线或者私有库需要定个版本的时候再打tag提交到索引库。
//主工程podfile
pod 'YMCommonViewLib',:git => 'http://****/ymcommonviewlib.git', :branch => 'branchName' #直接使用远程厂库的branchName最新提交,而不是通过ymspecrepo索引库中的tag标签
//还有一种方式,直接使用本地的仓库
# pod 'YMCommonViewLib',:path => '/Users/max/Project/YMCommonViewLib' #直接使用本地厂库, '/Users/max/Project/YMCommonViewLib' 是私有库在本地的目录,这种更方便于开发,在当前主工程项目里即可编译运行看到修改的效果。
如果想在私有库中添加像在PCH中导入的头文件,直接在Support Files下的prefix.pch中导入头文件,一旦在私有库工程中执行pod install操作,就会被重置,所以需要在.podspec文件中进行配置
s.prefix_header_contents = '#import <Masonry/Masonry.h>','#import "YYCategories.h"'