CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具。CocoaPods 的项目源码在 GitHub(https://github.com/CocoaPods )上管理。git
开发 iOS 项目不可避免地要使用第三方开源库,在使用第三方库时,除了须要导入源码,集成这些依赖库还须要咱们手动去配置,还有当这些第三方库发生了更新时,还须要手动去更新项目,这就显得很是麻烦。github
而 CocoaPods 的出现使得咱们能够节省设置和更新第三方开源库的时间,经过 CocoaPods,咱们能够将第三方的依赖库统一管理起来,配置和更新只须要经过简单的几行命令便可完成。vim
在使用 CocoaPods 以前,开发项目须要用到第三方开源库的时候,咱们须要:xcode
把开源库的源代码复制到项目中缓存
添加一些依赖框架和动态库ruby
设置 -Objc,-fno-objc-arc 等参数bash
管理它们的更新app
在使用 CocoaPods 以后,咱们只须要把用到的开源库放到一个名为 Podfile 的文件中,而后执行 pod update 就能够了,CocoaPods 就会自动将这些第三方开源库的源码下载下来,而且为咱们的工程设置好相应的系统依赖和编译参数。框架
CocoaPods 的原理是将全部的依赖库都放到另外一个名为 Pods 的项目中,而后让主项目依赖 Pods 项目,这样就把源码管理工做从主项目移到了 Pods 项目中。ssh
第三方库会被编译成 .a 静态库或者 .framwork 的动态连接库供咱们真正的工程使用。
CocoaPods 会将全部的第三方库以 target 的方式组成一个名为 Pods 的工程,该工程就放在刚才新生成的 Pods 目录下。整个第三方库工程会生成一个名称为 libPods.a 的静态库供咱们的工程使用。
对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在项目每次编译的时候都会执行,将第三方库的各类资源文件复制到目标目录中。
原来的工程设置已经被更改了,这时候咱们直接打开原来的工程文件去编译就会报错。咱们的工程和第三方库所在的 Pods 工程会被以一个新生成的 workspace 的形式组织和管理,方便咱们直观的管理工程和第三方库。
CocoaPods 经过一个名为 Pods.xcconfig 的文件来在编译时设置全部的依赖和参数。
CocoaPods 是用 Ruby 写的,并划分红了若干个 Gem 包。
与 CocoaPods 相关的两个目录:
~/.CocoaPods/repos/
:这个目录存储远端的 podspec 文件到本地。master 是全部第三方的 podspec 索引文件。其它的是咱们自定义的 podspec 索引文件。
~/Library/Caches/CocoaPods/
:这个目录就是缓存文件的存储目录。
CocoaPods 在解析执行过程当中最重要的几个包的路径分别是:CocoaPods/CocoaPods、CocoaPods/Core 和 CocoaPods/Xcodeproj。
CocoaPods/CocoaPods:这是面向用户的组件,每当执行一个 pod 命令时,这个组件将被激活。它包括了全部实用 CocoaPods 的功能,而且还能调用其它 Gem 包来执行任务。
CocoaPods/Core:Core Gem 提供了与 CocoaPods 相关的文件(主要是 Podfile 和 Podspecs)的处理。
Podfile:该文件用于配置项目所须要的第三方库,它能够被高度定制。
Podspecs:该文件描述了一个库将怎样被添加进工程中。.podspec 文件能够标识该第三方库所须要的源码文件、依赖库、编译选项,以及其余第三方库须要的配置。
CocoaPods/Xcodeproj:这个包负责处理工程文件,它能建立以及修改 .xcodeproj 文件和 .xcworkspace 文件。它也能够做为一个独立的包使用,当你要编写修改项目文件的脚本时,能够考虑使用 CocoaPods/Xcodeproj。
CocoaPods 是基于 ruby ecosystem 的,须要 ruby 环境,使用 ruby 的 gem 命令。因此咱们的系统要有 ruby 环境。而 Mac 系统默认会安装好 ruby 环境,能够在终端输入 $gem sources -l
命令查看系统 ruby 默认源为 https://rubygems.org/
,但这个源在国内是访问不到的,因此须要更换 ruby 镜像。
咱们可使用淘宝的源 https://ruby.taobao.org/
,可是淘宝的源已经不更新维护了,因此不建议使用淘宝的源,咱们最好使用 ruby-china 的源 https://gems.ruby-china.org
。
移除系统 ruby 默认源
$gem sources --remove https://rubygems.org/
使用新的源
$gem sources -a https://ruby.taobao.org/
(淘宝的源,不建议使用)
或
$gem source -a https://gems.ruby-china.org
验证是否替换成功
$gem sources -l
若是结果以下图,代表替换成功。
选择版本
安装最新版本
$sudo gem install -n /usr/local/bin CocoaPods
安装指定版本
$sudo gem install -n /usr/local/bin CocoaPods -v 1.0.0
安装最新的 release beta 版本
$sudo gem install -n /usr/local/bin CocoaPods --pre
安装
$pod setup
pod setup
的做用:将全部第三方的 Podspec 索引文件更新到本地的 ~/.CocoaPods/repos 目录下。全部的第三方开源库的 Podspec 文件都托管在 https://github.com/CocoaPods/Specs 管理,咱们须要把这个 Podspec 文件保存到本地,这样才能使用命令 pod search
来搜索一个开源库。
若是没有执行过 pod setup
,用户根目录 ~ 下是找不到 .CocoaPods/repos 目录的,没有建立这个目录。
若是执行了 pod setup
,可是命令没有执行成功,那么会建立 ~/.CocoaPods/repos 目录,只不过目录是空的。
若是执行了 pod setup
,而且命令执行成功,说明把 GitHub 上的 Podsepc 文件更新到了本地,那么会建立 ~/.CocoaPods/repos 目录,而且 repos 目录里有一个 master 目录,这个 master 目录保存的就是 GitHub 上全部第三方开源库的 Podspec 索引文件。
第一次执行 pod setup
时,这个 GitHub 上的 Podspec 索引文件比较大,因此第一次更新时很是慢,要耐心等待,咱们能够新建一个终端窗口,输入如下命令来查看下载文件的大小。
进入文件目录 ~/.CocoaPods
$cd ~/.CocoaPods
查看文件大小
$du -sh
验证是否安装成功以及是不是本身须要的版本
$pod --version
Gem 版本太低
Failed to send stats: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: sslv3 alert handshake failure
能够在终端输入如下命令:
查看 Gem 的版本号
$gem -v
或者 $gem --version
升级 Gem
$sudo gem update --system
若是出现如下错误:
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/update_rubygems
则输入如下命令来升级 Gem:
$sudo gem update -n /usr/local/bin --system
Gem 介绍:
Gem 是一个管理 Ruby 库和程序的标准包,它经过 RubyGem(如 http://rubygems.org/ )源来查找、安装、升级和卸载软件包,很是的便捷。若是 Gem 的版本太低就会致使 CocoaPods 安装失败。
全部的 Gem 包会被安装到 /[Ruby root]/lib/ruby/gems/[ver]/
目录下,其中包括了 cache、doc、gems、specifications 4 个目录,cache 下放置下载的原生 Gem 包,gems 下则放置解压过的 Gem 包。当安装过程当中遇到问题时,能够进入这些目录,手动删除有问题的 Gem 包,而后从新安装。
一些经常使用的 Gem 命令:
查看 Gem 配置源:
$gem sources -l
Gem 添加配置源:
$gem sources -a 源的url
Gem 删除配置源:
$gem sources -r 源的url
更新全部 Gem 包:
$gem update
更新指定的 Gem 包:
$gem update [gemname]
(注意:此命令不会升级旧版本的包)
更新 RubyGems 软件:
$gem update --system
清除全部 Gem 包旧版本,保留最新版本:
$gem cleanup
查看 Gem 环境:
$gem environment
从 Gem 源安装 Gem 包:
$gem install [gemname]
从本机安装 Gem 包:
$gem install -l [gemname].gem
安装指定版本的 Gem 包:
$gem install [gemname] --version=[版本号]
删除指定的 Gem 包:
$gem uninstall [gemname]
(注意:此命令将删除全部已安装的版本)
删除某指定版本 Gem:
$gem uninstall [gemname] --version=[版本号]
查看本机已安装的全部 Gem 包:
$gem list --local
Ruby 版本太低
ERROR: Error installing CocoaPods: activesupport requires Ruby version >= 2.2.2
在终端输入如下命令查看当前 Ruby 版本:
$ruby -v
Ruby 是什么?
Ruby 是一种简单快捷的面向对象脚本语言,主要用来实现一些自动化脚本。因为 iOS 系统上没有 Ruby 解释器,因此它一般是在 Mac 系统上使用,在编译前(绝非 app 运行时)进行一些自动化工做。CocoaPods 中的 podfile 其实就是一份 Ruby 代码。
升级 Ruby
升级 Ruby 要首先安装 RVM
RVM:Ruby Version Manager,Ruby 版本管理器,包括 Ruby 的版本管理和 Gem 库管理(gemset)。
打开终端,执行如下命令:
$curl -L get.rvm.io | bash -s stable
期间须要输入管理员密码,而后会自动经过 Homebrew 安装依赖包,等待一段时间后就能够成功安装好 RVM。
若是出现如下错误:
Error running 'requirements_osx_port_libs_install curl-ca-bundle automake libtool libyaml libffi libksba', showing last 15 lines of /Users/acewill/.rvm/log/1468253599_ruby-2.3.0/ package_install_curl-ca-bundle_automake_libtool_libyaml_libffi_libksba.log https://github.com/Homebrew/homebrew/wiki/Common-Issues
缘由是 Mac 上未安装 Homebrew,须要先安装 Homebrew。
Homebrew 是什么?
Homebrew 是一个包管理器,用于在 Mac 上安装一些 OS X 上没有的 UNIX 工具。Homebrew 将这些工具通通安装到了 /usr/local/Cellar
目录中,并在 /usr/local/bin
中建立符号连接。
安装 Homebrew
Homebrew 官网:http://brew.sh
从 Homebrew 官网获取安装命令在终端执行:
$/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
须要等待一段时间,Homebrew 安装成功以后,从新安装 RVM。
Homebrew 经常使用命令
搜索软件:$brew search git
安装软件:$brew install git
查看软件信息:$brew info git
更新本身:$brew update
检查过期软件:$brew outdated
升级能够升级的软件:$brew upgrade
清理不须要的软件版本及其安装包缓存:$brew cleanup
列出已安装的软件:$brew list
卸载软件:$brew unstall git
RVM 安装成功以后执行如下命令,载入 RVM 环境:
$source ~/.bashrc
$source ~/.bash_profile
$source ~/.profile
最后,执行如下命令测试是否安装正常:
$rvm -v
经过 RVM 升级 Ruby
列出已知的 Ruby 版本
$rvm list known
安装指定的 Ruby 版本
$rvm install 2.3.3
列出本地安装的全部 Ruby 版本
$rvm list
指定系统默认的 Ruby 版本
$rvm use 2.3.3 --default
删除指定的 Ruby 版本
$rvm remove 2.0.0
若是网速较慢的话,在执行 $rvm install 2.3.3
命令时,会花费很长的时间,并且很容易报时间超时的错误,解决办法就是屡次重试,或者等网速好的时候安装。
另外一种解决办法就是经过 Homebrew 来升级 Ruby。
打开终端,执行如下命令:
$brew install ruby
只须要等待很短的时间就能够升级 Ruby 成功。但经过这种方法升级 Ruby 以后,Gem 的版本可能不是最新的,咱们只须要按照上文中提到的升级 Gem 的方法来升级 Gem 便可。可是会出现如下错误:
ERROR: While executing gem ... (TypeError) no implicit conversion of nil into String
解决办法:打开 Finder-->前往-->前往文件夹,输入路径 /usr/local/lib/ruby/2.3.0/rubygems/installer.rb
,点击前往,找到 installer.rb 文件,打开该文件,找到文件中的如下代码段:
if ruby_executable then question << existing
而后用如下代码段替换找到的代码段:
if ruby_executable then
question << (existing || 'an unknown executable')
替换以后,Gem 就能够升级了。
GitHub 没法连接
error: RPC failed; result=56, HTTP code = 200 fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed
解决办法:FQ,而后从新安装。
CocoaPods 的分支不支持当前最新的 Xcode 版本
[!] An error occurred while performing
git pullon repo
master. [!] /usr/bin/git pull --ff-only
解决办法:删除 master 分支,从新创建新的分支,而后从新设置仓库便可。在终端执行如下命令:
$sudo rm -fr ~/.CocoaPods/repos/master
经常使用 CocoaPods 命令:
$pod setup
将全部第三方的 Podspec 索引文件更新到本地的 ~/.CocoaPods/repos/
目录下,更新本地仓库。
$pod repo update
执行 pod repo update
更新本地仓库,本地仓库完成后,便可搜索到指定的第三方库,做用相似 pod setup
。不过这个命令常常不单独调用。好比执行 pod setup
、pod search
、pod install
、pod update
会默认执行 pod repo update
。
$pod search 开源库
查找某一个开源库。
$pod list
列出全部可用的第三方库,如今已经 2.4W+ 了,还在不断地增加。
$pod install
根据 Podfile.lock 文件中列举的版本号来安装第三方框架,若是一开始 Podfile.lock 文件不存在,就会按照 Podfile 文件中列举的版本号来安装第三方框架。
若是检查到当前三方库已经有的话,那就不会去下载了。
$pod install –-no-repo-update
安装开源库以前,不会执行 pod repo update
指令。
$pod update
将全部第三方框架更新到最新版本,而且建立一个新的 Podfile.lock 文件。
不管当前三方库是否在项目中已经存在,都会从新下载更新。
$pod update –-no-repo-update
更新开源库以前,不会执行 pod repo update
指令。
如下以 AFNetworking 为例介绍 CocoaPods 的使用。
在终端搜索相应的开源类库
$pod search AFNetworking
若是 CocoaPods 支持,将会输出搜索到的全部类库版本和信息,以及在 Podfile 中配置的写法,例如:
若是提示没有找到该开源库,可是咱们这个第三方确实存在:
咱们可使用 pod setup
更新本地 podspec 索引文件,而后从新搜索。
若是按照 1 的方法仍是搜索不到,那咱们就把 ~/Library/Caches/CocoaPods/
目录下的缓存文件删除。而后 pod setup
,再从新搜索。
进入到咱们的工程目录
$cd 咱们的工程路径
在咱们的工程目录下建立 Podfile 文件
经过 Mac 默认文本编辑器编写
$touch podfile
建立 Podfile 文件
$open podfile
打开 Podfile 文件
打开 Podfile 文件以后便可编写,编写完成以后关闭文本编辑器便可。
使用 VIM 编辑器编写
$vim podfile
建立 Podfile 文件并使用 VIM 编写
执行命令以后默认是编辑模式,用键盘输入 i,进入输入模式,输入 pod 信息,完成以后按 Esc 键,退出输入模式进入编辑模式,而后再输入 : 号,进入末行模式,在 : 号后边输入 wq 保存退出 Podfile 文件,回到终端,继续进行下一步。
VIM 介绍
VIM 是一个相似于 VI 的著名的功能强大、高度可定制的文本编辑器。
VI:Visual Interface,可视化接口。
VIM:VI iMproved,VI 加强版全屏编辑器,又叫模式化编辑器。
VIM 有 3 种模式:
VIM 3 种模式间的转换:
编辑 --> 输入:
i:在当前光标所在字符的前面,转换为输入模式输入 --> 编辑:
Esc
编辑 --> 末行:
:
末行 --> 编辑:
Esc + ,或者按两次 Esc
输入模式和末行模式之间不能直接切换
使用 VIM 打开文件:
$vim 文件名 +#
打开文件,并定位于第 # 行
$vim 文件名 +:
打开文件,并定位于最后一行
使用 VIM 关闭文件:
末行模式下关闭文件
:w --> 保存
:w! --> 强行保存
:q --> 退出
:q! --> 不保存并退出
:wq --> 保存并退出
:x --> 保存并退出
编辑模式下关闭文件
ZZ --> 保存并退出
Podfile 介绍
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git' source 'https://github.com/CocoaPods/Specs.git' platform :iOS, '8.0' use_frameworks! inhibit_all_warnings! workspace 'CocoaPodsTest' target 'CocoaPodsTest' do project 'CocoaPodsTest' pod 'AFNetworking' pod 'JYCarousel', '0.0.1' pod 'WCJCache', :git => "http://gitlab.9ijx.com/iOS/WCJCache.git" target :CocoaPodsTestUITests do inherit! :search_paths pod 'YYText' end end
Podfile 语法解释:
source
指定 specs 的位置,自定义添加本身的 podspec。
platform :iOS, '8.0'
指定了开源库应该被编译在哪一个平台以及平台的最低版本。
若是不指定平台版本,官方文档里写明各平台默认值为 iOS:4.3,OS X:10.6,tvOS:9.0,watchOS:2.0。
use_frameworks!
使用 frameworks 动态库替换静态库连接
Swift 项目 CocoaPods 默认 use_frameworks!
OC 项目 CocoaPods 默认 #use_frameworks!
inhibit_all_warnings!
屏蔽 CocoaPods 库里面的全部警告
这个特性也能在子 target 里面定义,若是你想单独屏蔽某 pod 里面的警告也是能够的,例如:
pod 'JYCarousel', :inhibit_warnings => true
workspace
指定包含全部 projects 的 Xcode workspace
若是没有指定 workspace,而且在 Podfile 所在目录下只有一个 project,那么 project 的名称会被用做 workspace 的名称
target ‘xxxx’ do ... end
指定特定 target 的依赖库
能够嵌套子 target 的依赖库
project
默认状况下是没有指定的,当没有指定时,会使用 Podfile 目录下与 target 同名的工程
若是指定了 project,如上例所示,则 CocoaPodsTest 这个 target 只有在 CocoaPodsTest 工程中才会连接
inherit! :search_paths
依赖库的基本写法
pod 'AFNetworking' --> 不显式指定依赖库版本,表示每次都获取最新版本
pod 'AFNetworking', '2.0' --> 只使用 2.0 版本
pod 'AFNetworking', '> 2.0' --> 使用高于 2.0 的版本
pod 'AFNetworking', '>= 2.0' --> 使用大于或等于 2.0 的版本
pod 'AFNetworking', '< 2.0' --> 使用小于 2.0 的版本
pod 'AFNetworking', '<= 2.0' --> 使用小于或等于 2.0 的版本
pod 'AFNetworking', '~> 0.1.2' --> 使用大于等于 0.1.2 但小于 0.2 的版本
pod 'AFNetworking', '~> 0.1' --> 使用大于等于 0.1 但小于 1.0 的版本
pod 'AFNetworking', '~> 0' --> 高于 0 的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本
关于 Podfile.lock:
当执行 pod install
以后,CocoaPods 会生成一个名为 Podfile.lock 的文件。
Podfile.lock 应该加入到版本控制里面,不该该把这个文件加入到 ignores 中。由于 Podfile.lock 会锁定当前各依赖库的版本,以后若是屡次执行 pod install
不会更改版本,执行 pod update
时才会更改 Podfile.lock。
这样在多人协做的时候,能够防止出现第三方库升级时形成你们各自的第三方库版本不一致。
在终端执行如下命令:
$pod update –-no-repo-update
成功以后打开工程,此时咱们应该打开最新生成的 .xcworkspace 文件,便可使用该第三方库。
打开终端,cd 到已经配置好 CocoaPods 的项目目录下
打开该目录下的 Podfile 文件
删除 Podfile 文件中要移除的第三方库
从新执行 $pod update –-no-repo-update
命令
完成以上步骤便可移除项目中已经配置的类库
删除工程文件夹下的 Podfile、Podfile.lock 和 Pods 文件夹
删除 .xcworkspace 文件
打开 xcodeproj 文件,删除项目中的 Pods 文件夹以及 Pods.xcconfig 引用和 libpods.a 静态库
打开 Build Phases 选项,删除 Check Pods Manifest.lock
、Copy Pods Resources
和 Embeded Pods Frameworks
选项
完成以上步骤便可移除项目中的 CocoaPods,项目便可编译运行。
在终端执行如下命令:
$sudo gem uninstall CocoaPods
须要输入密码,以后等待很短期就会显示卸载成功。
卸载指定版本的 CocoaPods:
$sudo gem uninstall CocoaPods -v 0.39.0