前言:好久没写点什么,17年要多“提笔”了,无论是记录自己学习的点滴,还是分享一些技术感悟~给自己定个小目标,今年至少要完成50篇文章。也就是说基本每周出一篇。💪 最近项目中在用CocoaPods,这篇文章再温习一下吧~🤓
What ?
CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具,类似PHP的Composer,Java的Maven,NodeJs的npm。
Why ?
使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方库
在工程中引入第三方库会涉及到许多内容。针对 Objective-C 初级开发者来说,工程文件的配置会让人很沮丧。在配置 build phases 和 linker flags 过程中,会引起许多人为因素的错误。CocoaPods 简化了这一切,它能够自动配置编译选项。而且方便管理第三方库的版本,方便升级与控制。
例如实际开发中需要导入一些第三方库,在没有使用 CocoaPods 以前,我们需要:
1.把这些第三方开源库的源代码文件复制到项目中,或者设置成 git 的 submodule。
2.对于这些开源库通常需要依赖系统的一些 framework,我需要手工地将这些 framework 分别增加到项目依赖中,比如通常情况下,一个网络库就需要增加以下 framework: CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics, zlib。
3.对于某些开源库,我还需要设置-licucore或者 -fno-objc-arc等编译参数
4.管理这些依赖包的更新。
5.检测重复是否添加,是否有多个版本
这些体力活虽然简单,但毫无技术含量并且浪费时间。在使用 CocoaPods 之后,我们只需要将用到的第三方开源库放到一个名为 Podfile 的文件中,然后执行pod install。CocoaPods 就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数。【片段摘自巧神博客😉】
How ?
CocoaPods安装:
CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境,我们的MacOS都自带了Ruby环境。请尽可能用比较新的 RubyGems 版本,建议 2.6.x 以上,打开你的终端
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
gem sources -l https://gems.ruby-china.org
# 确保只有 gems.ruby-china.org
sudo gem update --system # 这里可能要翻墙一下
gem -v
注意,如果遇到 SSL 证书问题,你又无法解决,请直接用 http://gems.ruby-china.org
避免 SSL 的问题。
接下来执行安装CocoaPods命令:
sudo gem install cocoapods
pod setup
这步等待时间可能有点长,因为要下载大概几百M的文件,下载到 ~/.cocoapods目录下,如果你等太久,可以试着 cd 到那个目录,用du -sh *来查看下载进度。
当然我们也可以使用CocoaPods国内的镜像索引来加速下载速度
pod repo remove master
pod repo add master https://git.coding.net/CocoaPods/Specs.git
pod repo update
使用CocoaPods:
首先在你的项目目录下执行如下代码:
pod init
然后你会发现刚才的命令创建了一个Podfile 文件
Podfile 文件可以很简单:
target 'MyApp'
do pod 'ObjectiveSugar'
end
Podfile文件也可以很复杂:
platform :ios, '9.0'
inhibit_all_warnings!
target 'MyApp' do
pod 'ObjectiveSugar', '~> 0.5'
target "MyAppTests" do
inherit! :search_paths
pod 'OCMock', '~> 2.0.1'
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
puts "#{target.name}"
end
end
具体语法可以参考Podfile指南
这里简单说明一下常用的写法
- 保持使用最新版:
pod 'MBProgressHUD',
- 使用固定版本:
pod 'MBProgressHUD', '0.9.2'
- 指定最小版本:(实际中在0.92跟1.0.0之间,不包含1.0.0)
pod 'MBProgressHUD', '~>0.9.2'
对于版本号的个人理解:比如说0.9.2,0.x.x到1.x.x几这样跨度的应该是一个改动很大的版本,有可能会废弃一些老的API,可能会造成一些兼容性需适配问题。0.8.x到0.9.x这样的是增加了一些新功能,同时可能修复了一些bug。0.9.1到0.9.2这样增加版本号的,只是修复了一些bug没太多影响。
写好了Podfile文件之后执行命令:
pod install --verbose
#--verbose参数代表查看这个命令执行的详细过程
然后会生成xxx.xcworkspace
,和Podfile.lock
以及Pods
文件夹。以后打开工程用xxx.xcworkspace
关于Podfile 与 Podfile.lock需注意:
Podfile
文件以及Podfile.lock
文件应该加入到版本控制中(SVN or Git...),这一点也是官方文档中强调的。Podfile.lock
文件记录了当前所依赖的第三方库版本。当团队合作时,务必要保证大家版本一致性,不然可能会造成各种奇奇怪怪的bug以及隐患。
什么时候用pod install 什么时候用pod update ?
当你使用pod install
它只解决了Podfile
里面,但不在Podfile.lock
文件里面的那些库之间的依赖。对于在Podfile.lock
里面所列出的那些库,会下载在Podfile.lock
里面明确的版本,并不会去检查是否该库有新的版本。
比如说:Podfile文件如下
target 'testCocoaPods' do
pod 'MBProgressHUD', '~>0.9.1'
end
你当前 Podfile.lock
里面已经是0.9.1版本,你再执行pod install
的时候,Podfile.lock
里面的版本符合Podfile要求就等于没什么操作,即使有0.9.2版本更新也不会下载
当你运行 pod update PODNAME
命令时,CocoaPods会帮你更新到这个库的新版本,而不需要考虑Podfile.lock
里面的限制,它会更新到这个库尽可能的新版本,只要符合Podfile
里面的版本限制。
如果你运行pod update
,后面没有跟库的名字,CocoaPods就会更新每一个Podfile
里面的库到尽可能的最新版本。
比如:上面的例子运行 pod update
时候,如果有0.9.2版本,CocoaPods会按照你Podfile
文件的配置去更新,然后更改Podfile.lock
需要注意的事项:
运行 pod update
有时候你会感觉到特别慢,是因为它首先会去更新podspec
,使用--no-repo-update
参数可以禁止其做索引更新操作
EOF:文中难免会有一些错误的之处,欢迎大家拍砖~