CocoaPods组件化

新建私有库

pod lib create XYLib

过程中会回答一些问题,新建完成后会自动执行pod install (pod ‘XYLib’, :path => ‘../‘,本地调试Pod)命令,然后打开Example项目。接下来,我们可以在 XYLib/Classes文件夹下新建类文件并进行开发测试。

上传私有库并打tag

//GitHub上先新建XYLib仓库
git remote add origin https://github.com/Foerst/XYLib.git
git add .
git commit -m "init spec"
git push origin master

修改pod后要打个新tag

git tag 0.1.2

将本地tag推送到远程分支

git push --tags


ps:本地删除:

git tag -d 0.0.1 

远程删除:

git push origin :0.0.1

更新索引库

更新索引库, 如果没有要新建。https://github.com/Foerst/ECSpecs.git 是空白的索引库,ECSpecs索引库名字

pod repo add ECSpecs https://github.com/Foerst/ECSpecs.git

更新索引库命令

pod repo push ECSpecs ECLib.podspec --allow-warnings

ps: 执行以上命令的时候可能报错,如果远端项目空白,则在远端直接创建了一个README,然后就可以了。

子Pod

我们在编写podspec文件时,sourcefiles只是告诉pods哪些文件是这个项目中需要的,如果要包括文件的层级结构,就需要用到subspec。Pod里面的每一个文件夹,就是一个子pod,在编写podfile时,这样写
pod ‘Pod/SubPod’ 就表示引用其中的一个功能。如下图为AFNetWorking的子pod.

img

编写subspec

subspec元素
  • 文件夹结构 subspec sourcefiles的路径,一般都是在Classes文件夹下名为子pod的文件夹
  • 子pod 所依赖的系统库,用frameworks声明,多个用逗号隔开
  • 子pod 所依赖的第三方库,和其它subspec的路径,用dependency声明,可以像pod一样指定版本

举个例子:HLLKit的UI子pod, 它依赖MessageUI等多个系统框架,依赖第三方库YYCache,依赖子pod Foundation,源码保存在Classes/UI/下面,HLLKit/Assets/UI/路径下的所有资源文件会打包在UI.bundle中等。

s.subspec 'UI' do |sp|
      sp.source_files = 'HLLKit/Classes/UI/**/*.{h,m}'
      sp.public_header_files = 'HLLKit/Classes/UI/**/*.h'
      sp.dependency 'HLLKit/Foundation'
      sp.dependency 'AFNetworking', '~> 2.3'
      sp.frameworks = 'MessageUI', 'UIKit', 'MapKit'
      sp.resource_bundles = {
          'UI' => ['HLLKit/Assets/UI/*']
      }
 end


本地测试的时候,在子pod文件夹下添加源文件(Classes/subspec_name/)进行编码、添加资源文件(Assets/subspec_name/),添加完都要执行pod install重新集成到项目中,否则会验证podspec不通过。通过子pod的方式,集成在项目中的代码理论上也是按文件夹分类的。

ps:如果遇到源文件不放在指定目录下,屏蔽掉下面这句话,推测在指定subspec的source_files之后,不需要再指定父pod的 source_files,父pod的优先级较高,会有影响。

superPod.source_files = 'XYLib/Classes/**/*'

ps:可以工作目录下使用 pod spec lint 或者 pod spec lint .podspec文件路径 进行podspec文件的验证。

pod lib lint是只从本地验证你的pod能否通过验证
pod spec lint是从本地和远程验证你的pod能否通过验证

ps: swift下resource_bundles会导致 pod spec lint 失败,原因未知

资源访问

由于组件中的资源文件都是单独打包到一个bundle中的,再用UIKit的默认或者mianBundle访问资源都会失败。

参考

CocoaPods私有pod创建教程

基于CocoaPods的组件化原理及私有库实践

subspec

iOS 组件化 —— 路由设计思路分析

蘑菇街 App 的组件化之路

蘑菇街 App 的组件化之路·续

iOS应用架构谈 组件化方案