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

使用CocoaPods打造 --- 第三方库_第1张图片

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

CocoaPods工作原理

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

使用CocoaPods打造 --- 第三方库_第2张图片
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上搜索。

使用CocoaPods打造 --- 第三方库_第3张图片

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

使用CocoaPods打造 --- 第三方库_第4张图片
在clone下来的文件夹中,创建QYTimer文件夹,放入源码

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

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

// 打上标签
$ git tag 0.0.1
// 查看标签
$ git tag 
// 将标签同步到远端仓库
$ git push origin --tags
使用CocoaPods打造 --- 第三方库_第5张图片
远端仓库 tag

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

a). 创建.podspec 文件。

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

成功创建.podspec 文件
在文件夹中如下:
使用CocoaPods打造 --- 第三方库_第6张图片
.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 

使用CocoaPods打造 --- 第三方库_第7张图片

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

$ pod trunk push QYTimer.podspec

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

$ pod trunk push QYTimer.podspec --allow-warnings
使用CocoaPods打造 --- 第三方库_第8张图片
上传成功

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

使用CocoaPods打造 --- 第三方库_第9张图片
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
使用CocoaPods打造 --- 第三方库_第10张图片

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

$ pod install 

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

#import "ViewController.h"
#import 

@interface ViewController ()

@end

@implementation ViewController

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

到此就完成了!

第三方库地址 ->戳这里。


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

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


千里执行,始于足下。

你可能感兴趣的:(使用CocoaPods打造 --- 第三方库)