Cocoapods流程及pod库的制作

序:

对于 Cocoapods,你是否还只知道 pod installpod update,有时候还会掺杂上 pod searchpod setup等,对于它的工作流程都不是很熟悉,又或许你在搞组件化,但是对于pod库的制作流程有些记不清,可以浏览浏览

说来惭愧,2015年底参加工作的时候,我的小组长告诉我有一个管理第三方的工具,啥配置都不用管,拉下来就用,升级一个命令就行...

离职之后在另外两家公司都没有使用,我对 Cocoapods 的感觉,好像什么都知道,又好像什么都不知道,跳槽到58后发现这边在搞组件化用到了,重新整理一下

目录

  • 一、Cocopods流程及使用
  • 二、pod库的制作
  • 三、pod私有库的制作(一般用于组件化)

一、Cocopods流程及使用

Cocoapods工作流程

作用:管理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
pod init;生成Podfile文件
修改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'
何时使用

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 matching LeeButtonLayout
    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 search;如果删除再搜索的时候,生成索引文件,等待7-8分钟

二、pod库的制作(以制作LeeButtonLayout为例)

pod库制作.jpeg

制作步骤

  • 从模版库创建工程 (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


⚠️过程如下图所示
从模版库创建工程-图示
资源文件
代码文件
Demo
修改代码

回到Example文件夹下,执行pod install,进行代码测试

  • 2.2、修改.podspec配置文件
WechatIMG222.jpeg
  • 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
本地验证成功
远程验证成功
// 1、注册账户(邮箱+姓名+描述)
- pod trunk register 601623654@qq.com '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:    601623654@qq.com
  - 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、从模版库创建工程
WechatIMG242.jpeg
  • 3.3、将代码添加到Classes文件中
替换文件
  • 3.4、在Example文件夹下执行pod install,进行代码编译测试
  • 3.5、修改spec配置文件
    WechatIMG245.jpeg
  • 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 删除
这个过程是:先添加到本地配置库,再推送到远程仓库
远程配置仓库展示推送后的结果-0.1.0
  • 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

其他参考文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容