CocoaPods

一、基础操作

CocoaPods 简单说就是项目依赖框架(包括第三方库和私有库)自动化管理工具,其通过 Podfile 文件描述项目依赖框架,然后自动下载框架源码,创建 workspace 来构建项目。

1. 安装 CocoaPods

CocoaPods 是用 ruby 写的,Mac OS 中默认有 ruby,可以直接通过 ruby 包管理工具 gem 来安装,安装时需要系统命令 sudo 来获取管理员权限。

$ sudo gem install cocoapods

安装过程可能遇到的问题及解决方法

2. CocoaPods 使用

2.1 创建 Podfile 文件

$ pod init
# cd 到项目目录,pod init 命令会生成带模版的 Podfile 文件。

2.2 在 Podfile 文件中输入描述依赖库的相关信息,使用 ruby 来写,Podfile 文件官方介绍Podfile 语法官方介绍

Podfile 中可能包含的关键字:

source,指定从哪些仓库中获取依赖库的索引文件(podspec),开源库可以不指定,私有库必须指定

# CocoaPods 管理的开源库
source 'https://github.com/CocoaPods/Specs.git'
# 私有库
source 'git@git.ipo.com/Spec.git'

platform,指定平台,及 SDK 的版本号

platform:ios,'7.0'
# 一般要指定平台和版本号,如果不指定,默认是 ios、osx、tvos watchos 全平台,但相应平台的 sdk 版本会很低,可能满足不了依赖库的版本要求,会编译通不过。

target,指定配置是适配项目中哪个 target(一个项目中可能有多个 target)

# 例1
target 'AppTarget' do
    pod 'AFNetworking' '~> 7.0'
    target 'AppTestTarget' do 
        pod 'TestPod'
    end
end

# 例2
# There are no targets called "CommonPods" in any Xcode projects
abstract_target 'CommonPods' do
    pod 'common_pod1'
    pod 'common_pod2'
    # Has its own copy of target1_pod1
    target 'target1' do
        pod 'target1_pod1'
    end
    # Has its own copy of target2_pod1
    target 'target2' do
        pod 'target2_pod1'
    end
end
# 其中,common_pod1,common_pod2 是多个 target 共享的第三方库

# 例3(多个 target 共享 pods 隐式写法)
pod 'Common_pod1'
pod 'Common_pod2'
target 'target1' do
    pod 'target1_pod1'
end
target 'target2' do
    pod 'target2_pod1'
end

pod,用来指定依赖库及依赖库的版本

pod 'AFNetworking', '~> 3.0'
# 如果没有指定版本,默认为最新版本,可以指定固定版本好,也可以通过关系运算符指定版本范围。
'> 0.1' Any version higher than 0.1
'>= 0.1' Version 0.1 and any higher version
'< 0.1' Any version lower than 0.1
'<= 0.1' Version 0.1 and any lower version
'~> 0.1.2' Version 0.1.2 and the versions up to 0.2, not including 0.2 and higher, 指定范围内最新的版本
'~> 0.1' Version 0.1 and the versions up to 1.0, not including 1.0 and higher, 指定范围内最新的版本
'~> 0' Version 0 and higher, this is basically the same as not having it.

pod 'AFNetworking', :path => '~/Documents/AFNetworking'
# 指定本地路径为依赖库的源,CocoaPods 会在项目中直接引用这些文件,并且会随着这些文件的更新而自动更新,但是指定路径的 root path 中必须有相应依赖库的 podspec(这个参数主要用于同时进行开发的依赖库)。

有时我们需要引入依赖库指定的分支或者节点:
# 引入 master 分支(默认)
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git'
# 引入指定分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git', :branch => 'dev'
# 引入某个 tag 的代码
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git', :tag => '1.0.0'
# 引入某个 commit 节点
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git', :commit => '082f8319af'

subspecs,指定依赖库的子模块,
# 仅安装 AppKit 库下的 Model1 
pod 'AppKit/Model1'
# 安装 AppKit 库下的 Model1,Model2 和 Model3
pod 'AppKit', :subspecs => ['Model1', 'Model2', 'Model3']

# 指定新生成的 workspace 的名字,默认与 project name 相同
workspace 'WorkspaceName'

# ToDo podspec

常见的 Podfile 文件内容格式:

# 指定依赖库的来源地址(包括开源库和私有库)
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/Artsy/Specs.git'

# 指定平台和 sdk 版本号
platform:ios, '8.0'

# 忽略依赖库的所有警告
inhibit_all_warnings!

# 针对 App target 引入 AFNetworking
# 针对 TestApp target 引入 TestPod
target 'App' do
    # 如果指定 use_frameworks 会在 Pods 项目中的 product 中生成 framework,否则生成静态文件(.a文件)
    use_frameworks
    pod 'AFNetworking', '~> 3.0'
    target 'TestApp' do
        pod 'TestPod'
    end
end

# 只是 CocoaPods 的一些配置,官网并没有详细的说明,一般采取默认就好了,也就是不写
post_install do |installer|
    installer.pods_project.targets.each do |target|
        puts target.name
    end
end

2.3 构造依赖库及 workspace

$ pod install

执行 pod install 后,项目目录中会生成 Podfile.lock、app.xcworkspace 和 pods 文件夹(包含 Pods.xcodeproj)。

pod install VS pod update

参考

初次 pod install,会将 Podfile 文件中 source 指定的 url 中的所有依赖库的索引(podspec)都 clone 到本地目录中(~/.cocoapods/repos),所以会非常慢,podspec 文件下载完后,会继续根据 Podfile 中的依赖库信息(pod)找到相应的 podspec 文件,然后根据 podspec 中的配置信息下载安装对应的依赖库,并把已经安装的依赖库的版本号写入 Podfile.lock 文件。

以后,每次 pod install/update 操作,都会先去更新本地 podspec 索引库,如果不想每次都去下载 podspec 文件可以加参数 --no-repo-update

对 Podfile 文件进行增删改后,再进行 pod install,如果 Podfile.lock 中的版本满足 Podfile 中的描述要求,就直接使用 Podfile.lock 中的版本,如果不满足就重新下载安装,重新下载安装后,在将新版本号更新到 Podfile.lock 文件中。

pod update 命令,如果依赖库有新版本且满足 Podfile 描述,就会下载安装新版本的依赖库,并把版本号更新到 Podfile.lock 文件。

pod outdated 命令,会列出所有相对于已安装的依赖库版本(即 Podfile.lock 文件中写入的版本),有新的版本的依赖库及最新版本号。

Podfile.lock 文件的作用:统一团队中每个开发者使用的依赖库的版本号,所以需要将 Podfile 和 Podfile.lock 都 push 到 repo 上。

2.4 以 workspace 方式打开项目

$ open app.xcworkspace
// 也可以通过双击 app.xcworkspace 来打开

二、构建私有库

官方介绍

参考一

参考二

参考三

1. 创建一个私有 git 仓库用于管理私有库代码

创建私有库 git 仓库,然后进行开发、commit、打 tag 等操作。

2. 创建另一个私有 git 仓库用于管理私有库的索引文件 — podspec

可以在 github、sourcing、csdn 及 自己搭建的 git 服务器(gitlab)上创建 git 仓库。

2. 将私有库添加到 cocoapods

$ pod repo add REPO_NAME SOURCE_URL

# 其中 REPO_NAME,就是私有库 repo name,SOURCE_URL 是 podspec 仓库地址。命令执行后,会在 ~/.cocoapods/repos 目录下新生成一个 REPO_NAME 文件夹,并且将 SOURCE_URL clone 到该文件夹下。另外,~/.cocoapods/repos 文件夹下至少还会有一个 master 文件夹(如果 pod install 过的话),master 文件夹是 cocoapods 官方的 repo。 

$ cd ~/.cocoapods/repos/REPO_NAME
$ pod repo lint .

可以通过上述命令检验私有库是否添加成功。

3. 创建私有库索引文件 podspec(包括验证)

$ pod spec create POD_SPEC_NAME

# POD_SPEC_NAME 就是第一步创建的私有库的名字,该命令会创建一个 POD_SPEC_NAME.podspec 文件,文件是一个模版文件,其中包含包括 name、version、source 等私有库描述信息,只要进行替换就行了。

$ pod lib lint

# cd 到 POD_SPEC_NAME.podspec 文件所在的根目录,然后运行 pod lib lint 去验证,验证 podspec 描述的私有库是否有效、是否可获取等。

4. 将私有库索引文件添加到 repo 并推送到服务器

$ pod repo push REPO_NAME POD_SPEC_NAME.podspec

# 该命令会先执行一遍验证,即 pod lib lint,然后在 REPO_NAME 文件夹中创建 POD_SPEC_NAME/version/POD_SPEC_NAME.podspec,最后会将该目录路径推送到 SOURCE_URL 指定的 git repo 。

# 如果有警告,导致验证不通过,可以添加参数 --allow-warnings,忽略警告。

$ pod search POD_NAME

# 该命令可以用来验证私有库是否添加成功,其中,POD_NAME 就是我们添加的私有库的名称。如果搜索到库信息,说明添加成功,否则失败。

5. 使用 pod 在 Podfile 添加私有库来构建项目

在 Podfile 文件中,使用 source 来指定私有库索引文件(podspec)的 git 仓库 URL。使用 pod 来安装私有库。

三、将开源库在 cocoapods 中进行注册

官方介绍

1. 注册 cocoapods 账号

$ pod trunk register EMAIL_ADDRESS 'ALIAS' --description='Macbook pro'

# 想要向 cocoapods 注册开源库,肯定需要一个账号
# 注册成功后 cocoapods 会向注册的邮箱发送确认邮件

2. 将开源库部署到 cocopods上

$ pod trunk push [NAME.podspec]

# 该命令会将 podspec 部署到 cocoapos 上,并对外公开
# trunk 会在生成一个 JSON 后缀的 podspec 文件

$ pod trunk add-owner FRAMEWORK_NAME EMAIL_ADDRESS

# 该命令是给 cocoapods 注册的开源库增加管理者

注:
如果已经写好了开源库,可以是用上述流程;如果还没有写开源库,可以使用 pod lib create PROJECT_NAME 命令创建开源库,该命令会创建一个 Pod 所需要的所有文件、模版及 Example。

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

推荐阅读更多精彩内容