一、前言
CocoaPods is the dependency manager for Swift and Objective-C Cocoa projects. It has over ten thousand libraries and can help you scale your projects elegantly.
CocoaPods is built with Ruby and is installable with the default Ruby available on OS X. We recommend you do this.
Using the default Ruby install will require you to use sudo when installing gems. Further instructions are in the guides.
CocoaPods大家都知道是用来管理第三方库的重要工具。每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs 的 npm。Cocoapod的出现也是必然,方便的合并代码,不必烦琐地更新第三库这些优点就不必再提了。所以我也使用了一段是时间,但是由于学习的比较琐碎,所以就总结下,也作为自己的一份复习笔记吧。
(附上CocoaPods项目的源码地址:https://github.com/CocoaPods/Specs
感谢这个伟大的团队,让我们使用上了这么好用的工具)
<另外关于cocoapods的方面,也建议浏览唐巧的博客里面内容很全:http://blog.devtang.com/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/>
二、几个基本概念
- Cocoa
Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。 - CocoaPods
CocoaPods是一个负责管理iOS项目中第三方开源库的工具 - Ruby
CocoaPods是基于ruby ecosystem的,需要ruby环境,使用ruby的gem命令。所以我们的系统要有ruby环境。 - Gem
gem是一种文件组织的包,一般的ruby的很多插件都有由这种各种的包提供。 - 所以如果需要开发Gem的包,那么我们就有Ruby的环境,但是ruby的运行又需要gem包的支持,所以有了下文。
三、安装CoacoaPods
首先你需要安装ruby,幸运的是MAC系统默认会自动安装好ruby环境。
下面介绍常用的命令
//查看ruby的版本
ruby -v
//查看当前存在的ruby版本
rvm list known
安装对应的ruby版本(这个过程非常缓慢,请耐心等待,我MAC当前的版本是2.2.0)
rvm install 2.2.0
//查看ruby的源
gem sources -l
//查看Gem的版本
gem -v
//升级Gem版本
sudo gem update --system
OSX 10.11以前的安装命令
// 安装cocoapods
sudo gem install cocoapods
OSX EL Capitan的安装命令
//安装
sudo gem install -n /usr/local/bin cocoapods
// 安装制定版本
sudo gem install -n /usr/local/bin cocoapods -v 1.0.0
//Beta版本
sudo gem install -n /usr/local/bin cocoapods --pre
卸载coaoapods
sudo gem uninstall cocoapods
Pod命令部分
//查看当前cocoapods的版本,可以用来检测cocoapod是否成功,我MAC(10.12)的系统当前的版本是1.1.1
pod --version
//pod安装成功之后一个首先的操作就是执行命令(不是必须的)
将所有第三方的Podspec索引文件更新到本地的~/.cocoapods/repos目录下
pod setup
因为中国的防火墙的原因,我们必须更换到ruby-china的镜像
- 移除原来的源
gem soureces --remove https://rubygems.org/
- 添加新的源,之前一直都用淘宝源 https://ruby.taobao.org/ 但是听说已经不更新维护。建议使用ruby-china的源
gem sources -a https://gems.ruby-china.org
- 验证是否已经替换成功
gem sources -l
- 查看并升级Gem的版本,查考以上常见命令行。我当前MAC系统升级后的Gem版本为2.6.7。
- 更新Podspec的索引文件
使用pod --version来验证到目前为止的步骤是否是成功的。
执行pod setup
执行pod setup时,CocoaPods 会将第三方的podspec索引文件更新到本地的~/.cocoapods/repos目录下
- 如果没有执行过 pod setup,那用户根目录下~找不到.cocoapods/repos目录的,没有创建这个目录。
- 如果执行 pod setup,并且命令没有执行成功,那么会创建~/.cocoapods/repos目录,只不过目录是空的。
- 如果执行 pod setup,并且命令执行成功,说明把github上的Podsepc文件更新到本地,那么会创建~/.cocoapods/repos目录,并且repos目录里有一个master目录,这个master目录保存的就是github上所有第三方开源库的Podspec索引文件。
Attention:第一次执行pod setup特别慢,请耐心等待。
四、开始使用CocoaPods
A、关于Podfile
Podfile是什么
Podfile是cocoapods安装第三方库的依赖文件,其中定义cocoapod需要集成的第三库已经对应的系统要求等信息。关于 Podfile.lock
Podfile.lock 应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致。
CocoaPods 的这篇 官方文档 也在What is a Podfile.lock
一节中介绍了Podfile.lock
的作用,并且指出:
This file should always be kept under version control.
B、 Podfile的语法
- platform :ios, '7.0'
- 指定了开源库将被编译在哪个的平台iOS(默认是iOS, 还有 OS X, tvOS, watchOS) 以及对应的系统版本。注意:输入平台请都输入小写字母
- inhibit_all_warnings!
屏蔽cocoapods库里面的所有警告,这个特性也能在子target里面定义,如果你需要屏蔽某个pod里面的警告也可以是这样
pod 'TargetName', :inhibit_warnings => true
- use_frameworks!
a. 使用frameworks动态库替换静态库链接
b. swift项目cocoapods默认是 use_frameworks
c. OC项目cocoapods默认是 #use_frameworks <#是注释的意思>
- workspace
指定应该包含所有projects的Xcode workspace.
如果没有显示指定workspace并且在Podfile所在目录只有一个project,那么project的名称会被用作于workspace的名称
- projet
默认情况下是没有指定的,当没有指定时,会使用Podfile目录下与target同名的工程
- target 'XXX' do
end指定特定Target的依赖库,可以嵌套子Target的依赖库
- inherit! :search_paths
明确指定基层与父层的所有pod,默认是继承的
- source
指定specs的位置,自定义添加自己的podspec。公司内部使用
cocoapods 官方source是隐式的需要的,一旦你指定了其他source 你就需要也把官方的指定上
例如:
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
- 依赖库的基本写法
pod 'AFNetworking', '~> 3.1.0' //高于3.1.0的版本,表示使用最新版本
pod 'AFNetworking' //不指定依赖库版本,每次都获取最新版本
pod 'AFNetworking', '3.1.0' //只使用3.1.0的版本
pod 'AFNetworking', '>3.1.0' //使用高于3.1.0的版本
pod 'AFNetworking', '>=3.1.0' //使用大于等于
- 自定义依赖库的路径
Using the files from a folder local to the machine
pod 'Alamofire', :path => '~/Documents/Alamofire'
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'
To use a different branch of the repo:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'
To use a tag of the repo:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'
Or specify a commit:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'
- Podfile的官方网址
C、注意事项
- 不更新 podspec
CocoaPods 在执行pod install和pod update
时,会默认先更新一次podspec索引。使用--no-repo-update
参数可以禁止其做索引更新操作。如下所示:
pod install --no-repo-update
pod update --no-repo-update
- 需要了解更多可以查阅官方文档
https://guides.cocoapods.org/
D、常见的podfile结构
-
Simple Podfile
-
More complex Podfile
3.If you want multiple targets to share the same pods, use an abstract_target
4.There is implicit abstract target at the root of the Podfile, so you could write the above example as:
五、附录常见问题
- You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory
这是因为你没有使用管理员的身份运行,比如:gem update --system就需要管理员的权限,增加 sudo gem update --system就可以解决这个问题
- gem sources -l的输出结果,默认输出结果
输出结果
*** CURRENT SOURCES ***
https://rubygems.org/
- pod --version出现-bash: pod: command not found
可能是你的系统OSX EL Capitan以后命令,所以你需要使用对应OSX EL Capitan,查考前面的常用的命令行。
*Performing a deep fetch of the master
specs repo to improve future performance
遇到这个问题一般是在更新系统更新之后,先更新rubu,再更新了gem,之后更新cocoapods之后出现的。 是因为pod steup的时候创建master这个库,没成功,之后就算移除镜像重新安装的话 默认是从matser库里获取,导致安装不成功。出现了之后,可以在终端执行下列语句,再重新执行pod setup。
解决办法是移除master库,重新创建。
rm -rf ~/.cocoapods/repos/master
- pod setup 在执行时,会输出Setting up CocoaPods master repo
,但是会等待比较久的时间。这步其实是 Cocoapods 在将它的信息下载到 ~/.cocoapods目录下,如果你等太久,可以试着 cd 到那个目录,用du -sh *来查看下载进度。
*关于 pod setup时出现以下错误:
自己按照提示在终端输入以下命令:
pod repo add master https://github.com/CocoaPods/Specs.git
在网上查到的解决办法:在终端输入以下命令:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
后面的地址你可以打开Xcode显示包内容,找到那个文件夹拖到终端里面
还有一个更具体的解决的方法,亲测有效
解决方法:
cd ~/.cocoapods/repos
git clone https://github.com/CocoaPods/Specs.git master
pod install
还可以尝试
rm -fr ~/.cocoapods/repos/master
然后再一次
pod setup
-
安装过程出现,可以参考一下链接
rvm: command not found Mac
强烈建议 使用rvm安装ruby
1、安装 RVM
RVM:Ruby Version Manager,Ruby版本管理器,包括Ruby的版本管理和Gem库管理(gemset)
$ curl -L get.rvm.io | bash -s stable
等待一段时间后就可以成功安装好 RVM。
$ source ~/.bashrc
$ source ~/.bash_profile
测试是否安装正常
rvm -v
-
系统更新到最新的系统(10.13)
使用pod命令出现以下问题
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
那么重新执行一遍原文中提到的步骤
出现rvm命令不执行,找不到参考以上问题
补充部分Podfile的语法,转自别人的简书
source ‘URL’ : 指定镜像仓库的源
platform : iOS, ‘6.0’ : 指定所支持系统和最低版本
inhibit_all_warnings! :屏蔽所有warning
workspace ‘项目空间名’: 指定项目空间名
xcodeproj ‘工程文件名’:指定xcodeproj工程文件名
下面都是引入库的语句:
pod ‘库名’, : 引入库,什么版本都可以(一般就是最新版本了)
pod ‘库名’, ‘版本’ : 引入指定版本的库,下面的运算符可以指定版本的范围
还有> < >= <= :不解释 ~ > : 从指定版本到倒数第二位版本号升1为止,比如 ‘~> 1.2.1’是指 1.2.1 <= 版本 < 1.3.0
pod ‘库名’, :podspec => ‘podspec文件路径’ : 指定导入库的podspec文件路径
pod ‘库名’, :Git => ‘源码git地址’ : 指定导入库的源码git地址
pod ‘库名’, :tag => ‘tag名’ : 指定导入库的Tag分支