序:
对于 Cocoapods,你是否还只知道 pod install,pod update,有时候还会掺杂上 pod search, pod setup等,对于它的工作流程都不是很熟悉,又或许你在搞组件化,但是对于pod库的制作流程有些记不清,可以浏览浏览
说来惭愧,2015年底参加工作的时候,我的小组长告诉我有一个管理第三方的工具,啥配置都不用管,拉下来就用,升级一个命令就行...
离职之后在另外两家公司都没有使用,我对 Cocoapods 的感觉,好像什么都知道,又好像什么都不知道,跳槽到58后发现这边在搞组件化用到了,重新整理一下
目录
- 一、Cocopods流程及使用
- 二、pod库的制作
- 三、pod私有库的制作(一般用于组件化)
一、Cocopods流程及使用
作用:管理Xcode依赖的第三方框架
手动管理:
1、有可能会添加很多配置及系统依赖框架,繁琐易错;
2、如果框架升级了,需要替换本地工程里面的框架,再重新配置。Cocopods管理:
快速、自动集成第三方框架,并编译成一个libPod.a的静态库在项目中使用。
- 1.1、快速集成+简单使用
// 1、初始化pod(会自动生成Podfile等文件)
- pod init
// 2、修改Podfile文件,添加需要的第三方
platform :ios, '9.0'
target 'PodUsageDemo' do
use_frameworks!
pod 'AFNetworking'
end
// 3、下载安装
- pod install
- 1.2、Podfile文件
Podfile 是一种规范,描述了一个或多个 Xcode 项目的目标的依赖关系
// 1、根据不同的target下载不同的第三方代码
target 'ProjectName' do
pod 'AFNetworking'
pod 'SDWebImage'
end
target 'NotificationService' do
pod 'GTExtensionSDK', '2.2.4'
end
// 2、版本控制
pod 'AFNetworking' # 使用最新版本
pod 'AFNetworking', '3.0.0' # 只使用3.0.0版本
除了没有版本或特定版本之外,还可以使用逻辑运算符:
pod 'AFNetworking', '> 0.1' # 任何高于 0.1 的版本
pod 'AFNetworking', '>= 0.1' # 0.1 版及更高版本
pod 'AFNetworking', '< 0.1' # 任何低于 0.1 的版本
pod 'AFNetworking', '<= 0.1' # 版本 0.1 和任何更低版本
除了逻辑运算符之外,CocoaPods 还有一个乐观运算符~>:
pod 'AFNetworking', '~> 0.1.2 ' # 0.1.2 及 0.2 及以下版本,不包括 0.2 及更高版本
pod 'AFNetworking', '~> 0.1' # 0.1 及 1.0 以下的版本,不包括 1.0 及更高版本
pod 'AFNetworking', '~> 0' # 版本 0 和 1.0 之前的版本,不包括 1.0 及更高版本
// 3、使用本地文件夹路径(通常用于本地库,一般建议采用相对路径,避免重新配置)
pod 'AFNetworking', :path => '~/Documents/AFNetworking' # 绝对路径
pod 'AFNetworking', :path => '../AFNetworking' # 相对路径
// 4、使用远程索引库的地址
# 使用远程地址
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
# 使用远程地址 + 'dev'分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'dev'
# 使用远程地址 + 'tag'标签
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '3.1.1'
# 使用远程地址 + 'commit'提交记录
pod 'AFNetworking', :git => ''https://github.com/AFNetworking/AFNetworking.git', :commit => '0f506b1c45'
- 1.3、pod install vs. pod update
使用 pod install 还是 pod update ?
何时使用
pod install :添加、删除pod的时候(即使工程中已经存在Podfile或者已经执行过pod install)
pod update [#PODNAME] :仅在要将pod 更新到较新版本时使用主要区别场景
在Podfile文件内的框架版本描述中,有没有制定具体版本
pod --help
+ install Install project dependencies according to versions from a Podfile.lock
+ update Update outdated project dependencies and create new Podfile.lock
1、pod install
- 第一次在工程中使用pods时、每次编辑Podfile文件(新增、移除、更新)时使用;
- 每次执行pod install时,除了下载安装,还会在Podfile.lock文件夹中生成版本信息,用于跟踪和锁定该版本;
- Podfile.lock,在第一次运行pod install后生成的,记录每个安装库的版本号,并且锁定了这些版本;
- 对于在Podfile.lock中记录的版本,该命令会直接下载安装,不会去检查是否有新的版本;
- 对于不在Podfile.lock里面的库,执行该命令后会从Podfile文件的信息中查找对应版本。
2、pod update
- pod update参照Podfile安装,如果Podfile中没有做版本限制,会直接将第三方库升级为最新的
- 只关心Podfile中的版本限制,不考虑Podfile.lock里面的限制
- 如果只运行pod update,后面没有跟库的名字,CocoaPods就会更新Podfile里面所有的库到最新版本
3、pod outdated
- 会列出所有较Podfile.lock里面有新版本的库(一般用于更新前检查)
4、提升安装速度
输入pod install或者pod update之后,
- CocoaPods首先会去匹配本地spec库;
- 在确认spec库不需要更新之后,才会下载相应的库文件;
- 这样比较耗时,可使用以下命令,跳过spec版本库更新匹配
pod update --verbose --no-repo-update
pod install --verbose --no-repo-update
5、约定俗称的规则
- 提交代码时,省略Pod文件,其他人克隆源码后直接执行pod install,可节省远程仓库存储空间
- 一般添加pod的时候都会指明版本(防止其他人误更新)
- 关于升级:除非组内一起升级,保持版本同步才会执行pod update,否则只执行pod install
- 1.4、pod search xxxx
- 检索第三方框架
- 内部做的事情:从本地缓存的‘第三方框架描述信息’(.json)生成的检索文件中检索到相关框架信息
- 常见问题:检索不到,删除cocopods索引文件,rm ~/Library/Cache/...search_index.json
- 搜索失败及解决
[!] Unable to find a pod with name, author, summary, or description matchingLeeButtonLayout
1、删除search_index.json
2、执行如下代码
pod repo remove master
cd ~/.cocoapods/repos
git clone --depth 1 https://github.com/CocoaPods/Specs.git master
rm ~/Library/Caches/CocoaPods/search_index.json
pod search LeeButtonLayout
- 1.5、pod setup
将远程索引库克隆到本地索引库
- 1.6、名词解释
- 远程索引库:https://github.com/CocoaPods/Specs
- 本地索引库:/Users/qiangzhi/.cocoapods/repos/master/Specs
- 本地索引库检索文件:/Users/qiangzhi/Library/Caches/CocoaPods/search_index.json
第三方源码,第二次安装特别快,就是因为已经缓存到本地了,位置(/Users/qiangzhi/Library/Caches/CocoaPods/Pods)
如果删除search_index.json索引文件后,执行pod search xx 会重新生成search_index.json,需要几分钟
二、pod库的制作(以制作LeeButtonLayout为例)
制作步骤
- 从模版库创建工程 (pod lib create LeeButtonLayout)
- 将代码添加到 Classes 文件夹中
- 修改.podspec配置文件
- 将代码上传到GitHub远程仓库,并且打好标签
- pod验证
- 将.podspec文件发布到公有库中(trunk方式)
- 更新本地pod第三方框架信息数据源
- 2.1、从模版库创建工程
// 创建一个文件夹(例:remoteLib),从终端进入,执行以下命令,LeeButtonLayout就是库的名称
pod lib create LeeButtonLayout
// 你想在什么平台使用??(由于是制作移动端的库,所以输入iOS)
What platform do you want to use?? [ iOS / macOS ]
> iOS
// 你想使用什么语言??(我制作的库是使用ObjectC开发,所以输入ObjC)
What language do you want to use?? [ Swift / ObjC ]
> ObjC
// 您想在库中包含演示应用程序吗?(输入Yes,制作完成时会自动创建一个Example文件,里面是使用demo)
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
// 您将使用哪些测试框架?(暂无)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
// 你想做基于视图的测试吗?(暂无)
Would you like to do view based testing? [ Yes / No ]
> No
// 类前缀
What is your class prefix?
> Lee
⚠️过程如下图所示
回到Example文件夹下,执行pod install,进行代码测试
- 2.2、修改.podspec配置文件
- 2.3、将代码上传到GitHub远程仓库,并且打好标签
// 1、在github上创建好远程仓库,拿到远程仓库地址
// 2、初始化git、并关联推送到远程仓库
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git init
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git add .
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git commit -m "first commit"
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git branch -M master
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git remote add origin https://github.com/leeqiangzi/LeeButtonLayout.git
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git push -u origin master
// 3、添加tag并推送到远程仓库
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git tag '0.1.0'
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git push --tags
⚠️GitHub密码验证的支持在2021年8月13日之后就不支持了,需要配置ssh/token,可参考-《笔记-关于GitHub的操作》
- 2.4、pod验证(本地+远程)
// 验证本地库
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod lib lint
// 验证远程库
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod spec lint
二者主要区别:本地验证,不会验证tag
- 2.5、将.podspec文件发布到公有库中(trunk方式)
// 1、注册账户(邮箱+姓名+描述)
- pod trunk register [email protected] 'leeqiangzi' --description='LeeButtonLayout的配置文件'
// 2、打开邮箱,通过邮件内容验证section
// 3、推送到远程
- pod trunk push LeeButtonLayout.podspec
执行结果
// 执行打印结果
Updating spec repo `trunk` // 这一步在更新本地索引库
Validating podspec
-> LeeButtonLayout (0.1.0)
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | xcodebuild: note: Build preparation complete
- NOTE | [iOS] xcodebuild: note: Planning
- NOTE | [iOS] xcodebuild: note: Building targets in dependency order
Updating spec repo `trunk`
--------------------------------------------------------------------------------
Congrats
LeeButtonLayout (0.1.0) successfully published
January 31st, 05:38
https://cocoapods.org/pods/LeeButtonLayout
Tell your friends!
--------------------------------------------------------------------------------
查看自己是否注册过trunk
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk me
- Name: leeqiangzi
- Email: [email protected]
- Since: January 31st, 05:33
- Pods:
- LeeButtonLayout
- Sessions:
- January 31st, 05:33 - June 8th, 18:59. IP: 43.239.85.131 Description:
LeeButtonLayout的配置文件
- 2.6、pod升级(子库拆分+依赖)
pod升级过程
1、修改升级代码,提交到远程仓库,更新tag
2、修改spec文件,trunk方式提交
// 升级结果
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk push LeeButtonLayout.podspec
Updating spec repo `trunk`
Validating podspec
-> LeeButtonLayout (0.2.0)
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | xcodebuild: note: Build preparation complete
- NOTE | [iOS] xcodebuild: note: Planning
- NOTE | [iOS] xcodebuild: note: Building targets in dependency order
- NOTE | [iOS] xcodebuild: Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.2.99. (in target 'AFNetworking' from project 'Pods')
- NOTE | [iOS] xcodebuild: Pods.xcodeproj: warning: MobileCoreServices has been renamed. Use CoreServices instead. (in target 'AFNetworking' from project 'Pods')
Updating spec repo `trunk`
--------------------------------------------------------------------------------
Congrats
LeeButtonLayout (0.2.0) successfully published
February 6th, 03:40
https://cocoapods.org/pods/LeeButtonLayout
Tell your friends!
--------------------------------------------------------------------------------
三、远程私有库
与发布到pod上的主要区别
1、需要两个远程仓库(代码仓库 + spec仓库)
2、需要配置源路径,Podfile需要添加 source 'xxx'
3、推送配置文件使用pod repo push xxx xxx.podspec,不再使用trunk方式其他步骤与 ‘二、pod库的制作’ 基本一致,此方法一般用于公司内部组件化开发使用
- 3.1、创建远程代码仓库 + 远程配置仓库
- 3.2、从模版库创建工程
- 3.3、将代码添加到Classes文件中
- 3.4、在Example文件夹下执行pod install,进行代码编译测试
- 3.5、修改spec配置文件
- 3.6、将代码提交到远程仓库,添加tag
// 初始化git、关联远程仓库、推送代码
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git init
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git add .
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git commit -m 'first commit'
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git remote add origin https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInput.git
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push origin master
// 添加标签并推送
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git tag '0.1.0'
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push --tags
- 3.7、验证(本地+远程)
- 3.8、推送配置文件
1、添加源地址
pod repo add LeeLimitInput https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git
2、将spec推送到远程
pod repo push LeeLimitInput LeeLimitInput.podspec
⚠️如果名称写错可通过 pod repo remove xxx 删除
- 3.9、修改Podfile(添加source),执行pod install
# 如果不添加source,则直接到pod的master中查找
# 通过pod repo查看source
source 'https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git'
# 公有库源添加
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
target 'PodUsageDemo' do
use_frameworks!
pod 'LeeLimitInput'
end
其他参考文档
- 官方文档
- 你真的会用 CocoaPods 吗?
- iOS 基于 Cocoapods 插件进行组件二进制的探索
- CocoaPods 工作原理及使用中遇到的问题
- 使用 pod install 还是 pod update ?
- 小马哥组件化视频