使用CocoaPods打造 --- 第三方库

如果对 Cocoapods 不是很了解的同鞋,可以 查看官方文档

CocoaPods工作原理

开始之前先简单大致介绍下 CocoaPods 工作原理吧。
我画的神图:

CocoaPods工作原理图

原理分析:

  • 平常使用的AFNetworing、SDWebImage等库都是将自己的 (.podspec)库描述文件 提交到 cocoaPods 的官方远程索引库当中;
    可以看这里https://github.com/CocoaPods/Specs/tree/master/Specs
  • (.podspec)库描述文件 包含了库的名字、版本号、描述、作者、真实的源码所在地址、。。。等等信息;
  • 当执行 pod setup 时,会把当前时间点的远端索引库clone到我们本地;
    可以通过前往文件夹(command+shift+G): ~/.cocoapods/repos/master/Specs 查看clone到本地的索引库;
  • 当执行pod search 库名(搜索的是本地索引库)指令时,第一次搜索特别慢,因为会在 ~/Library/Caches/CocoaPods 路径下生成一个检索索引文件 search_index.json (我的大小在25.5M左右);以后搜索会直接在该文件内查找,快很多。
  • 当执行 pod install 时,会根据 (.podspec)库描述文件 中的 source 找到库的源码地址,安装到项目中。

提到安装指令这里补充下:

当执行 pod install / pod update 指令时,会触发cocoaPods更新本地Spec仓库。需要更新整个仓库,从检查到具体的更新,速度自然快不了。
可执行下面的指令解决:

// --verbose:查看详细的执行日志
// --no-repo-update : 告诉pod不用检测和更新本地spec仓库
$ pod install --verbose --no-repo-update 
$ pod update --verbose --no-repo-update 

pod installpod update 的区别:

  • pod install: 如果发现项目中有 Podfile.lock 文件,直接执行该文件;若没有,执行 Podfile 文件,然后生成 Podfile.lock 文件;
  • pod update:不管是否有 Podfile.lock 文件,直接执行 Podfile 文件,然后生成 Podfile.lock 文件。
    官网的比较 ->戳这里

在项目中工作的原理:

CocoaPods的原理是将所有的依赖库都放到另一个名为 Pods 的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了 Pods 项目中。下面是一些技术细节:

  1. Pods项目最终会编译成一个名为 libPods.a 的文件,主项目只需要依赖这个.a文件即可。
  2. 对于资源文件,CocoaPods提供了一个名为 Pods-resources.sh 的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
  3. CocoaPods通过一个名为 Pods.xcconfig 的文件在编译时设置所有的依赖和参数。

核心组件:

CocoaPods是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。在解析整合过程中,最重要的几个 gems 分别是: CocoaPods/CocoaPods, CocoaPods/Core, 和 CocoaPods/Xcodeproj (是的,CocoaPods 是一个依赖管理工具 -- 利用依赖管理进行构建的!)。

CocoaPods 是一个 objc 的依赖管理工具,而其本身是利用 ruby 的依赖管理 gem 进行构建的

CocoaPods/CocoaPod

这是是一个面向用户的组件,每当执行一个 pod 命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods 涉及到的功能,并且还能通过调用所有其它的 gems 来执行任务。

CocoaPods/Core

Core 组件提供支持与 CocoaPods 相关文件的处理,文件主要是 Podfilepodspecs

Podfile

Podfile 是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅 Podfile 指南

Podspec

.podspec 也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。

CocoaPods/Xcodeproj

这个 gem 组件负责所有工程文件的整合。它能够对创建并修改 .xcodeproj.xcworkspace 文件。它也可以作为单独的一个 gem 包使用。如果你想要写一个脚本来方便的修改工程文件,那么可以使用这个 gem。

打造远程第三方库:

(1):新建远端仓库,存放我们的第三方库源码。

a). 新建仓库,这里我使用的是gitHub仓库,仓库的名称最好和我们第三方库的名称一致,这样便于别人在GitHub上搜索。

b). clone仓库到本地,新建框架文件夹,放入我们的源码。

在clone下来的文件夹中,创建QYTimer文件夹,放入源码

c). 将源代码push推到远端仓库。

d). 为项目打上tag(因为.podspec文件中的s.source需要用到tag来区分版本),将tag推到远端仓库。
对tag不熟的可以 查看git官网

// 打上标签
$ git tag 0.0.1
// 查看标签
$ git tag 
// 将标签同步到远端仓库
$ git push origin --tags
远端仓库 tag

(2):在源代码同级文件夹中,:创建.podspec描述文件。

a). 创建.podspec 文件。

// QYTimer 为.podspec文件的名字
$ pod spec create QYTimer

成功创建.podspec 文件
在文件夹中如下:
.podsepc文件要和存放源码的文件同级

b). 编辑.podspec 文件。
对该文件内的属性不是很了解的可以看 ->戳这里,毕竟官方才是最权威的。

Pod::Spec.new do |s|

  # 库的名字
  s.name         = "QYTimer"
  # 版本号
  s.version      = "0.0.1"
  # 摘要(长度要小于下面的描述)
  s.summary      = "QYTimer Class."
  # 描述 
  s.description  = "a Class of solve the retainCycle."
  # 主页(这里采用该库的gitHub主页)
  s.homepage     = "https://github.com/qiaoyoung/QYTimer"
  # 许可证
  s.license      = "MIT"
  # 作者信息
  s.author       = { "填写你的名字" => "填写你的邮箱" }
  # 源码地址(这里使用gitHub仓库地址)
  s.source       = { :git => "https://github.com/qiaoyoung/QYTimer.git", :tag => "#{s.version}" }
  # 需要安装的源码
  s.source_files = "QYTimer", "QYTimer/**/*.{h,m}"

end

(3):文件校验。

a). 先本地校验 .podspec 文件。

$ pod lib lint

校验之后发现有好多警告,根据提示可以使用 --allow-warnings 忽略警告。

$ pod lib lint --allow-warnings 
本地校验通过,其他信息可暂时忽略

b). 远程校验 .podspec 文件。

$ pod spec lint

同本地验证一样,出现警告使用 --allow-warnings 忽略。

$ pod spec lint --allow-warnings 
远端校验通过

(4):注册trunk,上传 .podspec文件到CocoaPods官方远程索引库。

a). 在命令行输入下列指令,然后会收到一封带有验证了链接的邮件。

// 邮箱名:必须真实,需要验证
// --verbose:查看详细的执行日志
$ pod trunk register 邮箱名 '用户名' --verbose

点击邮件链接确认。然后可以执行该指令查看注册信息:

$ pod trunk me 


b). 上传 .podspec文件到远程索引库。

$ pod trunk push QYTimer.podspec

上传验证的时候如果报警告的错误,可以根据提示使用 --allow-warnings 忽略。

$ pod trunk push QYTimer.podspec --allow-warnings
上传成功

我们可以在CococaPods的远程仓库中看到我们刚才上传的 .podspec文件。

https://github.com/CocoaPods/Specs/tree/master/Specs

此时我们的库已经发布成功啦!

(5):项目中使用我们的第三方库。

a). 搜索我们刚才发布的第三方库。

$ pod search QYTimer

然而并没有搜到,因为我们的第三方库发布到了CocoaPods远端索引库,而我们的本地索引库并没有更新。

// 更新本地索引库
$ pod setup 
// 删除旧的检索索引文件
$ rm ~/Library/Caches/CocoaPods/search_index.json

再次搜索:

$ pod search QYTimer

b). 将搜索到的第三方库复制到我们的 Podfile 文件中,更新我们的pod库。

$ pod install 

c). 在需要使用的类中引入我们的第三方库。

#import "ViewController.h"
#import <NSTimer+QYBlockSupport.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [NSTimer qy_scheduledTimerWithTimeInterval:1 repeats:YES block:^{
        NSLog(@"test~");
    }];
    
}

到此就完成了!

第三方库地址 ->戳这里


通过上面的步骤,一步步手动创建了自己的第三方库,是否觉得有点麻烦呢?(我是感觉挺繁琐的)

这里有个自动创建的方式推荐给大家,作者阐述的非常详细,可以 ->戳这里查看原文


千里执行,始于足下。

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

推荐阅读更多精彩内容