CocoaPods安装与使用

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 installpod 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的文件来在编译时设置所有的依赖和参数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。