CocoaPods简介
CocoaPods是iOS开发、macOS开发中的包依赖管理工具,是一个开源的项目,源码是用ruby写的,源码地址在GitHub上。
无论是做iOS开发还是macOS开发,都不可避免的要使用到一些第三方库,优秀的第三方库能够提升我们的开发效率。如果不使用包依赖管理工具,我们需要:
1.把这些第三方开源库的源代码文件复制到项目中,或者设置成 git 的 submodule。
2.对于这些开源库通常需要依赖系统的一些 framework,我需要手工地将这些 framework 分别增加到项目依赖中。
3.对于某些开源库,我还需要设置-licucore或者 -fno-objc-arc等编译参数
4.管理这些依赖包的更新。
以上工作虽然简单,但是如果项目中的第三方库较多,需要耗费大量的时间和精力。在使用 CocoaPods 之后,我只需要将用到的第三方开源库放到一个名为 Podfile 的文件中,然后执行pod install。
CocoaPods 就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。
CocoaPods安装
安装
安装方式非常简单 , Mac 下都自带 ruby,使用 ruby 的 gem 命令即可下载安装,为了稳妥起见,安装前我们可以检测下ruby和gem有没有安装。
查看有没有安装ruby
ruby --version
查看有没有安装gem
gem --version
如果gem的版本号过低,安装CocoaPods可能会失败。所以在安装CocoaPods之前可以升级一下gem
sudo gem update --system
注意:ruby 的 软件源 使用的是亚马逊的云服务,所以被墙了,需要将官方的 ruby 源替换成国内淘宝的源
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem source -l
以上工作做完后,我们就可以安装CocoaPods了
// 安装CocoaPods
sudo gem install cocoapods
安装成功后,在使用之前,还需要对CocoaPods初始化
// 初始化CocoaPods
pod setup
注意,pod setup
在执行时,会输出Setting up CocoaPods master repo
,但是会等待比较久的时间。这步其实是 Cocoapods 在将它的信息下载到~/.cocoapods
目录下,如果你等太久,可以试着 cd 到那个目录,用du -sh *
来查看下载进度。你也可以参考本文接下来的使用 cocoapods 的镜像索引
一节的内容来提高下载速度。
CocoaPods 的镜像索引
所有的项目的 Podspec 文件都托管在https://github.com/CocoaPods/Specs
。第一次执行pod setup
时,CocoaPods 会将这些podspec
索引文件更新到本地的 ~/.cocoapods/
目录下,这个索引文件比较大,有 80M 左右。所以第一次更新时非常慢,我有一次就更新了将近 1 个小时才完成。
为此,我可以镜像地址设置为国内的oschina地址
pod repo remove master
pod repo add master http://git.oschina.net/akuandev/Specs.git
pod repo update
CocoaPods使用
1.创建Podfile
文件
使用CocoaPods时需要新建一个名为 Podfile
的文件,找到项目中与.xcodeproj
同级的文件夹,在该目录下新建一个Podfile
文件
// 注意:此时Terminal的当前路径一定要是项目中`.xcodeproj`所在文件夹路径
touch Podfile
运行此命令后会进入到vim
编辑器页面,此时就可以编写Podfile
文件内容了
2.编辑Podfile
Podfile
文件有其固定的格式,可以从网上找一个,然后修改里面的内容即可。这里随便贴一个:
# Uncomment this line to define a global platform for your project
# 声明平台是iOS还是osx,以及第三方库所要支持的系统最低版本号
platform :ios, '8.0'
# 一个Podfile中可以有多个target。比如说插件开发中,
# 主项目和插件项目所依赖的包可能是不同的,
# 就可以写两个target,分别设置依赖的第三方库。
target 'ProjectName' do
# 需要导入的第三方库(pod 'package name', 'version number')
pod 'SDWebImage', '~> 4.3.2'
end
3.安装依赖
Podfile
文件编辑完成后,退出vim
执行命令:
pod install
现在,第三方库已经下载完成并且设置好了编译参数和依赖,我们需要记住两点:
1.使用 CocoaPods 生成的 .xcworkspace
文件来打开工程,而不是以前的.xcodeproj
文件。
2.每次更改了 Podfile
文件,你需要重新执行一次pod update
命令。
查找第三方库
你如果不知道 cocoaPods 管理的库中,是否有你想要的库,那么你可以通过 pod search 命令进行查找,以下是我用 pod search SDWebImage 查找到的所有可用的库:
$pod search SDWebImage
-> SDWebImage (5.0.2)
Asynchronous image downloader with cache support with an UIImageView
category.
pod 'SDWebImage', '~> 5.0.2'
- Homepage: https://github.com/SDWebImage/SDWebImage
- Source: https://github.com/SDWebImage/SDWebImage.git
- Versions: 5.0.2, 5.0.1, 5.0.0, 5.0.0-beta6, 5.0.0-beta5, 5.0.0-beta4,
5.0.0-beta3, 5.0.0-beta2, 5.0.0-beta, 4.4.6, 4.4.5, 4.4.4, 4.4.3, 4.4.2,
4.4.1, 4.4.0, 4.3.3, 4.3.2, 4.3.1, 4.3.0, 4.2.3, 4.2.2, 4.2.1, 4.2.0, 4.1.2,
4.1.1, 4.1.0, 4.0.0, 4.0.0-beta2, 4.0.0-beta, 3.8.2, 3.8.1, 3.8.0, 3.7.6,
3.7.5, 3.7.4, 3.7.3, 3.7.2, 3.7.1, 3.7.0, 3.6, 3.5.4, 3.5.2, 3.5.1, 3.5, 3.4,
3.3, 3.2, 3.1, 3.0, 2.7.4, 2.7, 2.6, 2.5, 2.4 [master repo]
- Subspecs:
- SDWebImage/Core (5.0.2)
- SDWebImage/MapKit (5.0.2)
-> SDWebImage+ExtensionSupport (3.7.1.2)
Asynchronous image downloader with cache support with an UIImageView
category. Added SD_APP_EXTENSION macro for ios8 extensions
pod 'SDWebImage+ExtensionSupport', '~> 3.7.1.2'
- Homepage: https://github.com/rs/SDWebImage
- Source: https://github.com/glassoff/SDWebImage.git
// ... 以下省略若干行
关于 Podfile.lock
当你执行pod install
之后,除了 Podfile
外,CocoaPods 还会生成一个名为Podfile.lock
的文件,Podfile.lock
应该加入到版本控制里面,不应该把这个文件加入到.gitignore
中。因为Podfile.lock
会锁定当前各依赖库的版本,之后如果多次执行pod install
不会更改版本,要pod update
才会改Podfile.lock
了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。
创建 podspec 文件
我们可以为自己的开源项目创建podspec
文件,首先通过如下命令初始化一个podspec
文件:
pod spec create your_pod_spec_name
该命令执行之后,CocoaPods 会生成一个名为your_pod_spec_name.podspec
的文件,然后我们修改其中的相关内容即可。
podspec
文件中可以做很多的配置,如果想要了解更多,可以参考gitHub上一些比较好的开源库,看下podspec文件是怎么写的。
使用私有的 pods
我们可以直接指定某一个依赖的 podspec
,这样就可以使用公司内部的私有库。该方案有利于使企业内部的公共项目支持 CocoaPods。如下是一个示例:
pod 'xxxxxx', :podspec => 'https://xxx/xxx.podspec'
不更新 podspec
CocoaPods 在执行pod install
和pod update
时,会默认先更新一次podspec
索引。使用--no-repo-update
参数可以禁止其做索引更新操作
pod install --no-repo-update
pod update --no-repo-update
生成第三方库的帮助文档
如果你想让 CococaPods 帮你生成第三方库的帮助文档,并集成到 Xcode 中,那么用 brew 安装 appledoc 即可:
brew install appledoc
原理
粗浅的了解了一下 CocoaPods 的原理,它是将所有的依赖库都放到另一个名为 Pods 项目中,然后让主项目依赖 Pods 项目,这样,源码管理工作都从主项目移到了 Pods 项目中。发现的一些技术细节有:
1.Pods 项目最终会编译成一个名为libPods.a
的文件,主项目只需要依赖这个.a
文件即可。
2.对于资源文件,CocoaPods 提供了一个名为Pods-resources.sh
的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
3.CocoaPods 通过一个名为 Pods.xcconfig
的文件来在编译时设置所有的依赖和参数。