Cocoapods,让iOS开发更简单(一):走近Cocoapods

前段时间结合自己平时的学习研究做了一个有关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以保存所有第三方库的版本号。


podLock文件.png

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供广大开发者使用。

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

推荐阅读更多精彩内容