前段时间结合自己平时的学习研究做了一个有关pods的内部分享,接下来会把相关资料以文字的形式分享出来,预估是一个pods系列,希望能较为全面的将其相关知识点与实践运用呈现出来,也希望和大家多多交流。话不多说,那我们就即刻出发吧!
pod系列文章
Cocoapods,让iOS开发更简单(一):走近Cocoapods
Cocoapods,让iOS开发更简单(二):创建私有库
Cocoapods,让iOS开发更简单(三):实践经验汇总
一文带你快速分清静态库-动态库-Framework
是什么
CocoaPods是OS和iOS平台上的一个第三方依赖库管理工具,通过它我们可以更加
高效的
依赖并管理被称为“Pods”的库。在iOS开发中,现在的Cocoapods已经是事实上的添加第三方库的标准方式了。
它拥有超过49,000个第三方库,超过3,000,000个app都在使用CocoaPods做依赖管理,CocoaPods可以帮助你优雅的扩展你的项目。
为什么使用它
在iOS开发项目中,经常会使用第三方库,手动引入流程复杂,并且库之间存在依赖关系,手动管理较繁琐。但采用CocoaPods,安装和升级都只是一句命令的事情,让开发者可专注于业务本身。
方便:方便查找、依赖、管理和更新第三方库,同时方便了工程调试和阶段性开发;
规范:库的使用及创建都要符合标准;
直观:对于库的创建和使用都清晰明了的按格式有标注;
集中:库及项目中都有指定的文件进行相应的管理;
自动化:在引入第三方库时可以做到自动为项目完成各种各样的配置,包括配置编译阶段、连接器选项、甚至是ARC环境下的-fno-objc-arc配置等;
它是怎么起作用的
CocoaPods是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。核心组件gems 分别是: CocoaPods/CocoaPods、CocoaPods/Core和 CocoaPods/Xcodeproj。
CocoaPods/CocoaPod
这是一个面向用户的组件,每当执行一个 pod 命令时,这个组件都将被激活。该组件包括了所有使用 CocoaPods 涉及到的功能,并且还能通过调用所有其它的 gems 来执行任务。CocoaPods/Core
Core 组件提供支持与 CocoaPods 相关文件的处理,文件主要是 podfile 和 podspec。CocoaPods/Xcodeproj
这个 gem 组件负责所有工程文件的整合。它能够创建并修改 .xcodeproj 和 .xcworkspace 文件。
基于以上核心组件,实现:
- 自动化配置:通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。
- 管理资源文件:CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
- 依赖管理:CocoaPods将所有依赖的库都放在一个名为Pods的项目下,然后让主项目依赖Pods项目,Pods项目最终会编译为一个libPod-项目名.a静态库(Pods_xxx.framework),主项目依赖于该库。
Spec Repo
Spec Repo是所有的Pods的一个索引,可以理解为是一个容器。对于公有的Spec Repo,所有公开的Pods都通过这个库进行索引,其实际是GitHub上的一个Git仓库。当开发者使用了CocoaPods后会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo,目录的结构为:
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
如何用
安装Cocoapods环境
CocaPods的安装在ruby环境上通过Gem 安装,具体安装步骤不赘述。
//安装CocoaPods
sudo gem install cocoapods
#sudo gem install -n /usr/local/bin cocoapods
pod setup
podSpec文件
podSpec文件可以理解为一个库的信息简介和说明书,支持列出源文件、framework、编译选项和某个库所需要的依赖等。
podspec文件是一个Ruby的文件,示例:
Pod::Spec.new do |s|
s.name = "PodTestLibrary" #名称
s.version = "0.1.0" #版本号
s.summary = "Just Testing." #简短介绍,下面是详细介绍
s.description = <<-DESC
Testing Private Podspec.
DESC
s.homepage = "https://github.com/hello/PodTestLibrary"
#主页,这里要填写可以访问到的地址,不然验证不通过
s.license = 'MIT' #开源协议
s.author = { "hello" => "hello@good.com" } #作者信息
s.source = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "0.0.1" }
#项目地址,支持HTTP和HTTPS,最好使用HTTPS
s.platform = :ios, '7.0' #支持的平台及最低版本
s.source_files = 'Pod/Classes/**/*'
#代码源文件地址,如果有多个目录下则用逗号分开,目录指定了pod install下载的内容
s.resource_bundles = {
'PodTestLibrary' => ['Pod/Assets/*.png']
} #资源文件地址
s.public_header_files = 'Pod/Classes/**/*.h' #公开头文件地址
s.frameworks = 'UIKit' #所需的framework,多个用逗号隔开
s.dependency 'AFNetworking', '~> 2.3'
#依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
end
subspec
subspec模板:
s.subspec '子模块名称' do |别名,不能和子模块名称相同,比如ss|
ss.source_files = ''
end
subspec示例:
Pod::Spec.new do |s|
s.name = "PodTestLibrary"
s.version = "1.0.0"
s.summary = "Just Testing."
s.description = <<-DESC
Testing Private Podspec.
* Markdown format.
DESC
s.homepage = "https://github.com/hello/PodTestLibrary"
s.license = 'MIT'
s.author = { "hello" => "hello@good.com" }
s.source = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "1.0.0" }
s.platform = :ios, '7.0'
#s.source_files = 'Pod/Classes/**/*'
#s.resource_bundles = {
# 'PodTestLibrary' => ['Pod/Assets/*.png']
#}
#s.public_header_files = 'Pod/Classes/**/*.h'
s.subspec 'NetWorkEngine' do |networkEngine|
networkEngine.source_files = 'Pod/Classes/NetworkEngine/**/*'
networkEngine.public_header_files = 'Pod/Classes/NetworkEngine/**/*.h'
networkEngine.dependency 'AFNetworking', '~> 2.3'
end
s.subspec 'CommonTools' do |commonTools|
commonTools.source_files = 'Pod/Classes/CommonTools/**/*'
commonTools.public_header_files = 'Pod/Classes/CommonTools/**/*.h'
commonTools.dependency 'OpenUDID', '~> 1.0.0'
commonTools.dependency 'NetWorkEngine'
end
s.frameworks = 'UIKit'
end
原项目整体的依赖dependency、源文件source_files、头文件public_header_files和资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如CommonTools就依赖于NetWorkEngine。
在podSpec中建立subspec,有以下作用:
- pod依赖文件划分在不同的目录结构下;
- 实现按需依赖;
Podfile文件
Podfile 文件用于定义项目所需要使用的第三方库以及项目的基本配置。举例如下:
source 'https://github.com/CocoaPods/Specs.git' # 官方库源
source 'https://gitlab.corp.ttt.com:hello/PodTestSpec.git' # 私有库源
platform :ios, '7.0'
pod 'PodTestLibrary/NetWorkEngine', '1.0.0' #依赖某一个部分
pod 'PodTestLibrary', '1.0.0' #使用整个库
管理依赖库版本号
- 不指定任何版本号,举例为:
pod 'AFNetworking'
- 指定固定的版本号,举例:
pod 'AFNetworking', '1.0' // 版本号指定为1.0
还有一些灵活的依赖用法,会在同系列后续文章专门板块中介绍,敬请关注。
Podfile.lock文件
Podfile.lock文件跟踪最后一次更新pods以保存所有第三方库的版本号。
Pods目录
保存通过pod install 或 pod update下载下来的第三方库的代码。
xxx.xcworkspace文件
接入CocoaPods后重新生成的一个工作空间,打开该文件进行开发。
常用命令
常用命令有:
pod --help:可以查看pod可以使用的命令;
pod repo list: 查看本地spec仓库列表;
pod init:项目pod初始化,创建默认的Podfile文件;
pod install:安装pods库;
pod install --no-repo-update:安装框架,不更新本地索引,不会升级本地代码库;
pod update:升级、添加、删除框架;
pod update --no-repo-update:更新框架,不更新本地索引,可安装框架或删除不用的框架,但不会升级安装已安装的框架;
pod list:列出项目中所有依赖的库;
pod repo update:从远程仓库更新本地spec repo仓库;
哪些地方可以用
依赖公共库
pod 'AFNetworking', '~> 0.1.5'
依赖私有库
pod 'PodTestLibrary', '~> 0.1.0'
如果我们同时使用了公有库和私有库,我们只需要在Podfile的头部同时把公有库和私有库的source加上即可。
创建私有库
下面会在本系列中专门出一个创建私有库的文章,大家敬请期待吧。
创建公有库
如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看官方文档
在 guides.cocoapods里面有一个 Getting setup with Trunk,注册 trunk,它的作用是能够让我们把本地的 spec 文件上传到 gitHub的远程索引库,发布自己的代码到Cocoapods供广大开发者使用。