Cocoapods

203 阅读3分钟

一、CocoaPods简介

CocoaPods Guides

CocoaPods是iOS平台当前最流行的包管理工具,可以将它理解为一个可以自动部署到项目的组件池,而对应的Podfile文件就相当于请求组件的Request。当组件下载到工程后,cocoaPods会自动完成组件集成到现有项目的工作,并完成修改.xcodeproj文件和创建.xcworkspace文件,最终将所有组件统一打包成Pods.framework静态库,供项目使用。

在CocoaPods中,会存在以下几种文件:

  • podspec: 组件库的Pod描述文件,定义了库的项目地址、项目使用的平台和版本信息、项目依赖的其他库等信息
  • Podfie: 用户编写的对于期望加载的Pod以及对应的Target信息
  • Podfile.lock: 记录了当前安装的依赖库的版本
  • mainfest.lock: 记录了本地pod的基本信息,实际上是podfile.lock的拷贝

二、pod install 运行原理

一开始使用CocoaPods,最熟悉的命令应该就是pod install了,那它背后帮我们做了什么呢?

  1. 分析Dependency,对比本地pod的Version和podfile.lock中的pod version,如果不一致会提示存在风险;
  2. 对比Podfile是否发生了变化,如果存在问题,会生成两个列表,一个是需要Add的Pod(s),一个是需要Remove的Pod(s);
  3. (如果存在Remove的)删除需要Remove的Pods
  4. 添加需要的Pod(s),此时,如果是常规的CocoaPods库(如果基于Git),会先去:
    • Spec下查找对应的Pod文件夹
    • 找到对应的tag
    • 定位其Podspec文件
    • git clone下来对应的文件(根据具体的协议不同,存在几种方式download:Bazaar、HTTP、SCP、SVN)
    • copy到Pod文件夹中
    • 运行pre-install hook
  5. 生成Pod Project
    • 将该Pod中对应文件添加到工程中
    • 添加对应的framework、.a库、bundle等
    • 链接头文件(link headers),生成Target
    • 运行post-install hook
  6. 生成podfile.lock文件,之后生成此文件的副本,将其放到Pod文件夹内,命名为mainfest.lock(如果出现 The sandbix is not sync with the podfile.lock 错误,则表示mainfest.lock和podfile.lock文件不一致,此时一般需要重新运行pod install命令);
  7. 配置原有的project文件(add build phase)
    • 添加了 Embed Pods Frameworks

    • 添加了 Copy Pod Resources

三、Cocoapods创建私有podspec

可参考文章:使用Cocoapods创建私有podspec

1、创建私有Spec Repo,Specs.git地址
#如果成功的话进入到~/.cocoapods/repos目录下就可以看到minisdk-ios-specs这个目录了
pod repo add minisdk-ios-specs https://git.woa.com/ilive-components/minisdk-components-iOS/PodComponents/Specs.git
2、创建pod项目工程文件
# a.本地创建工程文件
pod lib create LVRoomPushService

# b.关联远程git
git add .
git commit -s -m 'init'
git remote add origin https://git.woa.com/ilive-components/minisdk-components-iOS/LVRoomPushService.git

# c.打tag
git tag -m 'first release' 0.0.1
git push origin 0.0.1

# d.编辑podspec文件
s.source
s.denpendency
s.frameworks
s.source_files
s.public_header_files
3、验证podspec文件
# a.本地验证
pod lib lint   

# b.远程验证:如果这个库依赖了其他私有库,用--sources选项,
#   不然会出现找不到repo错误,比如LVRoomPushService依赖了LVCommon,LVCommon在私有仓库地址下
pod spec lint --source='私有仓库repo地址,https://github.com/CocoaPods/Specs'

# c.或者直接推远程看报错来修改.podspec文件(执行成功会直接上库,在Spec仓库生成对应版本的.podspec)
pod repo push https://git.woa.com/ilive-components/minisdk-components-iOS/PodComponents/Specs *.podspec --sources=https://git.woa.com/ilive-sdk-ios/Specs,https://git.woa.com/ilive-components/minisdk-components-iOS/PodComponents/Specs --use-libraries --skip-import-validation --verbose --allow-warnings

注:有时候pod repo push失败,可以看看是否是缓存原因,在/Users/<#your-user-directory#>/Library/Caches/CocoaPods/Pods目录清除缓存

4、其他
  • 如何切换cocoapods版本
    # 有的项目需要依赖特定版本的pod,我们需要切换cocoapod版本,几个相关的命令:
    
    # a. 查看当前版本
    pod --version
    
    # b.安装的版本列表
    gem list cocoapods
    
    # c.卸载当前的cocoapods版本
    sudo gem uninstall cocoapods
    
    # d.安装特定版本
    sudo gem install cocoapods -v 1.9.1
    
    # e.制定特定的版本执行pod命令
    pod _1.9.1_ install
    
    

参考

CocoaPods官网
CocoaPods原理总结
基于CocoaPods的组件化原理及私有库实践
CocoaPods使用私有库中遇到的坑