iOS进阶篇-关于CocoaPods

一、前言

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的镜像

  1. 移除原来的源

gem soureces --remove https://rubygems.org/

  1. 添加新的源,之前一直都用淘宝源 https://ruby.taobao.org/ 但是听说已经不更新维护。建议使用ruby-china的源

gem sources -a https://gems.ruby-china.org

  1. 验证是否已经替换成功

gem sources -l

  1. 查看并升级Gem的版本,查考以上常见命令行。我当前MAC系统升级后的Gem版本为2.6.7。
  2. 更新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

  1. Podfile是什么
    Podfile是cocoapods安装第三方库的依赖文件,其中定义cocoapod需要集成的第三库已经对应的系统要求等信息。

  2. 关于 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的语法

  1. platform :ios, '7.0'
  • 指定了开源库将被编译在哪个的平台iOS(默认是iOS, 还有 OS X, tvOS, watchOS) 以及对应的系统版本。注意:输入平台请都输入小写字母
  1. inhibit_all_warnings!

屏蔽cocoapods库里面的所有警告,这个特性也能在子target里面定义,如果你需要屏蔽某个pod里面的警告也可以是这样
pod 'TargetName', :inhibit_warnings => true

  1. use_frameworks!

a. 使用frameworks动态库替换静态库链接
b. swift项目cocoapods默认是 use_frameworks
c. OC项目cocoapods默认是 #use_frameworks <#是注释的意思>

  1. workspace

指定应该包含所有projects的Xcode workspace.
如果没有显示指定workspace并且在Podfile所在目录只有一个project,那么project的名称会被用作于workspace的名称

  1. projet

默认情况下是没有指定的,当没有指定时,会使用Podfile目录下与target同名的工程

  1. target 'XXX' do
    end

指定特定Target的依赖库,可以嵌套子Target的依赖库

  1. inherit! :search_paths

明确指定基层与父层的所有pod,默认是继承的

  1. source

指定specs的位置,自定义添加自己的podspec。公司内部使用
cocoapods 官方source是隐式的需要的,一旦你指定了其他source 你就需要也把官方的指定上
例如:
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'

  1. 依赖库的基本写法

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' //使用大于等于

  1. 自定义依赖库的路径

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'

  1. Podfile的官方网址

https://guides.cocoapods.org/using/the-podfile.html

C、注意事项

  1. 不更新 podspec
    CocoaPods 在执行pod install和pod update
    时,会默认先更新一次podspec索引。使用--no-repo-update
    参数可以禁止其做索引更新操作。如下所示:

pod install --no-repo-update
pod update --no-repo-update

  1. 需要了解更多可以查阅官方文档
    https://guides.cocoapods.org/

D、常见的podfile结构

  1. Simple Podfile


    SimpleExample
  2. More complex Podfile


    more complex Podfile.png

3.If you want multiple targets to share the same pods, use an abstract_target


abstract_target.png

4.There is implicit abstract target at the root of the Podfile, so you could write the above example as:


Abstract target at the root of the Podfile.png

五、附录常见问题

  • 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 *来查看下载进度。
    查看进度.png

*关于 pod setup时出现以下错误:

Paste_Image.png

自己按照提示在终端输入以下命令:
pod repo add master https://github.com/CocoaPods/Specs.git
Paste_Image.png

在网上查到的解决办法:在终端输入以下命令:

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

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
    image.png

    那么重新执行一遍原文中提到的步骤
    出现rvm命令不执行,找不到参考以上问题
    发现有新版本所以将ruby更新到2.4.png

    重新安装可以解决绝大多数问题.png

    安装完成后.png

补充部分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分支

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具。CocoaPo...
    朝洋阅读 25,630评论 3 51
  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,392评论 0 39
  • 阅读感悟: “the social misfit";"another conversation stopp...
    zdw301阅读 290评论 0 0
  • 啊,你来了!真是劳累你了。”淑兰老人的女儿荷芬慌忙上前扶住脚步沉重的有田老人。 “她在哪?”有田试图挺起脊背,可终...
    阿协喜欢调八阅读 292评论 0 0
  • 永远热泪盈眶
    初爱Z阅读 270评论 0 0