如果对 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 install
和 pod update
的区别:
-
pod install
: 如果发现项目中有Podfile.lock
文件,直接执行该文件;若没有,执行Podfile
文件,然后生成Podfile.lock
文件; -
pod update
:不管是否有Podfile.lock
文件,直接执行Podfile
文件,然后生成Podfile.lock
文件。
官网的比较 ->戳这里。
在项目中工作的原理:
CocoaPods的原理是将所有的依赖库都放到另一个名为 Pods
的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了 Pods
项目中。下面是一些技术细节:
- Pods项目最终会编译成一个名为
libPods.a
的文件,主项目只需要依赖这个.a文件即可。- 对于资源文件,CocoaPods提供了一个名为
Pods-resources.sh
的bash脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。- 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 相关文件的处理,文件主要是 Podfile
和 podspecs
。
Podfile
Podfile 是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅 Podfile 指南。
Podspec
.podspec
也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。
CocoaPods/Xcodeproj
这个 gem 组件负责所有工程文件的整合。它能够对创建并修改 .xcodeproj
和 .xcworkspace
文件。它也可以作为单独的一个 gem 包使用。如果你想要写一个脚本来方便的修改工程文件,那么可以使用这个 gem。
打造远程第三方库:
(1):新建远端仓库,存放我们的第三方库源码。
a). 新建仓库,这里我使用的是gitHub仓库,仓库的名称最好和我们第三方库的名称一致,这样便于别人在GitHub上搜索。
b). clone仓库到本地,新建框架文件夹,放入我们的源码。
c). 将源代码push推到远端仓库。
d). 为项目打上tag(因为.podspec文件中的s.source需要用到tag来区分版本),将tag推到远端仓库。
对tag不熟的可以 查看git官网。
// 打上标签
$ git tag 0.0.1
// 查看标签
$ git tag
// 将标签同步到远端仓库
$ git push origin --tags
(2):在源代码同级文件夹中,:创建.podspec描述文件。
a). 创建.podspec 文件。
// QYTimer 为.podspec文件的名字
$ pod spec create QYTimer
在文件夹中如下:
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文件。
此时我们的库已经发布成功啦!
(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
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[NSTimer qy_scheduledTimerWithTimeInterval:1 repeats:YES block:^{
NSLog(@"test~");
}];
}
到此就完成了!
第三方库地址 ->戳这里。
通过上面的步骤,一步步手动创建了自己的第三方库,是否觉得有点麻烦呢?(我是感觉挺繁琐的)
这里有个自动创建的方式推荐给大家,作者阐述的非常详细,可以 ->戳这里查看原文。
千里执行,始于足下。