CocoaPods 使用总结
CocoaPods简介
CocoaPods 是专门为 iOS 工程提供第三方依赖库的管理工具,通过 CocoaPods,我们可以更方便地管理每个第三方库的版本,而且不需要我们做太多的配置,就可以直观、集中和自动化地管理我们项目的第三方库。
CocoaPods 将所有依赖的库都放在一个名为 Pods 的项目下,然后让主项目依赖 Pods 项目。然后,我们编码工作都从主项目转移到 Pods 项目。Pods 项目最终会编译为一个 libPod-项目名.a 静态库,主项目依赖于这个静态库。
对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。CocoaPods 是用 Ruby 写的,并由若干个 Ruby 包 (gems) 构成的。在解析整合过程中,最重要的几个 gems 分别是: CocoaPods/CocoaPods、CocoaPods/Core 和 CocoaPods/Xcodeproj。
CocoaPod的核心组件
- CocoaPods/CocoaPod
这是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用CocoaPods涉及到的功能,并且还能通过调用所有其它的gems来执行任务。 - CocoaPods/Core
Core组件提供支持与CocoaPods相关文件的处理,文件主要是Podfile和podspecs。 - Podfile
Podfile是一个文件,用于定义项目所需要使用的第三方库。该文件支持高度定制,你可以根据个人喜好对其做出定制。更多相关信息,请查阅Podfile指南。 - Podspec
.podspec也是一个文件,该文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等。 - CocoaPods/Xcodeproj
这个gem组件负责所有工程文件的整合。它能够创建并修改.xcodeproj和.xcworkspace文件。它也可以作为单独的一个gem包使用。如果你想要写一个脚本来方便地修改工程文件,那么可以使用这个gem。
私有库开发流程
一般公司都会搭建自己的 git 服务器,在实战项目中,经常使用 Cocoapods 管理自己的私有库。
git仓库至少需要两个,一个用于管理私有库对应版本的podspec文件,一个用于存放私有库的源文件。- 查看现有的
podspec源地址:1
cd ~/.cocoapods/repos
创建一个私有的 podspec 主要包括如下几步:
- 创建一个私有的
Spec Repo,用于管理私有库对应版本的podspec文件; - 创建
pod私有库所需要的项目工程文件,并上传到私有库; - 创建
pod所对应的podspec文件,并进行验证/测试; - 向私有的
Spec Repo中提交podspec; - 使用
pod库;
创建一个私有的 Spec Repo
- 在自己公司的
git服务器上创建SpecsRepo仓库; - 将私有
SpecsRepo关联到本地;1
pod repo add IMXSpecsRepo http://192.168.120.32/app/sisi-iOS/IMXSpecsRepo.git
查看 SpecsRepo 是否创建成功
1 | cd ~/.cocoapods/repos |
创建 pod 私有库所需要的项目工程
命令行创建
1 | pod lib create 仓库名字 --template-url=http://192.168.120.32/app/sisi-iOS/IMXPodTemplte |
手动创建
手动创建 Xcode 工程项目,创建 podspec 文件
1 | pod spec create XXXX.podspec |
修改 podspec 文件
1 | Pod::Spec.new do |s| |
podspec 语法简介
1 | s.name:私有库的名称,`pod search`搜索的关键词,注意这里一定要和`.podspec`的名称一样,否则报错。 |
更多语法查看(http://guides.cocoapods.org/making/specs-and-specs-repo.html)
上传项目工程的源文件
1 | git add -A |
验证 podspec 文件
1 | pod lib lint --allow-warnings --verbose |
当看到 AKCBrowser passed validation。表示验证通过。
向 Spec Repo 中提交 podspec 文件
1 | # 如果依赖其他私有源 同样需要加上 --sources 参数 |
多 target 时 Podfile 该如何写
1 | platform :ios, '8.0' |
如何忽略Pods警告
在 Podfile 中对应的 target 或分组下加上关键字 inhibit_all_warnings即可。
如何直接引用第三方库中的头文件
在用 CocoaPods 集成第三方库之后,默认情况下,我们需要使用类似 #import <XXX/YYY.h>的方式引入第三方库的头文件。
可以在 Build Settings -> User Header Search Paths 中添加 ${SRCROOT} 并设置成 recursive,这样我们就可以直接使用 #impot "YYY.h"这种方式了。
pod install 和 pod update 的选择
pod install:
按照官方文档所说,pod install在第一次检索集成第三方以及每一次在 Podfile 中新增、更改或删除 pod 的时候使用。每一次执行 pod install命令,它都会下载安装新的 pod,并且会把每一个安装的 pod 的版本信息写入 Podfile.lock 文件。Podfile.lock 文件跟踪每一个安装的 pod 的版本并且上锁。每一次执行 pod install命令,只解决还没有在 Podfile.lock 中列出的依赖:对于已在 Podfile.lock 中列出的 pod,会下载指定的版本,不会检查是否有新版本。对于没有在 Podfile.lock 中列出的 pod,它会搜索并安装 Podfile 中指定的版本。
pod update:
直接执行 pod update命令会检查安装 Podfile 中列出的所有 pod 的最新版本。只有当你想要更新 pod 库的版本时才使用 pod update;它不管 Podfile.lock是否存在,都会读取 Podfile 文件的最新版本,下载好之后,重新生成 Podfile.lock文件。
两者的区别:
用
pod install命令来安装新的pod,每次在Podfile中新增和删除pod都使用pod install命令。在
Podfile中添加新的pod后应该用pod install命令,而不是pod update命令。通过pod install命令安装新的pod而不用担心在同一进程中修改已有的pod。pod update命令仅用在更新指定pod到指定版本或者更新所有pod。
如果想更新指定的 pod 仓库,可以使用
1 | pod update XXX –no-repo-update |
如果想安装新添加的库
1 | pod install –no-repo-update |
当需要在 CocoaPods 中删除一个我们不要的库时 可以在 Podfile 中直接删除相关库;
1 | pod update --no-repo-update 会在删除相关库时 更新其他库版本 |
关于版本指定约束
一般我们在使用 cocoapods 导入第三方库前都会生成一个 podfile 文件,文件中记录着我们要导入的第三方库以及对应的版本信息,比如:
1 | pod 'SDWebImage', '~> 4.3.2' |
让 cocoapods 导入 SDWbImage,版本号 4.3.2 和版本号处于 4.3.2-4.4 之间的,不包括 4.4 和更高版本。
1 | pod 'SDWebImage' --- 不指定版本,表示希望使用最新版本 |
tag 改动原则:
- 增加 api,修改第三位;
- 修改 api,修改第二位;
- 大版本变更修改第一位;
卸载旧版本 cocoapods 安装新的
1 | sudo gem uninstall cocoapods-core cocoapods cocoapods-deintegrate cocoapods-downloader cocoapods-plugins cocoapods-search cocoapods-stats cocoapods-trunk cocoapods-try coderay colored2 concurrent-ruby cocoapods-clean |
pod 库太多,每次构建编译都很耗费时间
1 | install! 'cocoapods', generate_multiple_pod_projects: true |
pod 库每次修改代码,主工程必须 clean 再安装才可以看到新改动的代码
1 | install! 'cocoapods', :disable_input_output_paths => true |
pod lint 产生的信息太多,一屏显示不全,但是出错之后我们可能需要去查看 error 信息,上下翻页不方便
利用脚本 >1.log 2>&1 将当前的 pod lint 产生的信息写入文件
1 | pod lib lint --sources=****,**** --allow-warnings --verbose --use-libraries >1.log 2>&1 |