CocoaPods:你想要的都在这

CocoaPods 入门

什么是 CocoaPods

CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods本身所支持的),并且可以轻松管理其版本。

Cocoapods意义体现在两个方面。第一,在引入第三方库时它可以自动为我们完成各种各样的配置,包括配置编译阶段、连接器选项、甚至是ARC环境下的-fno-objc-arc配置等。第二,使用CocoaPods可以很方便地查找新的第三方库, 更新类库也是支持一键更新,免除更新时的繁琐操作。

英语能力较好者传送门:CocoaPods官方文档

CocoaPods 的核心组件

CocoaPods是用Ruby写的,并划分成了若干个Gem包。
CocoaPods在解析执行过程中最重要的几个包。
其路径分别是:CocoaPods/CocoaPods、 CocoaPods/Core和 CocoaPods/Xcodeproj。 
CocoaPods/CocoaPod

这是面向用户的组件,每当执行一个pod命令时,这个组件将被激活。它包括了所有实用CocoaPods的功能,并且还能调用其他gem包来执行任务。

CocoaPods/Core

Core gem提供了与CocoaPods相关的文件(主要是podfile和podspecs)的处理。

CocoaPods/Xcodeproj

这个包负责处理工程文件,它能创建以及修改.xcodeproj文件和.xcworkspace文件。它也可以作为一个独立的包使用,当你要编写修改项目文件的脚本时,可以考虑使用CocoaPods/Xcodeproj。

Podfile

该文件用于配置项目所需要的第三方库,它可以被高度定制。

Podfile.lock

当你执行pod install之后,除了 Podfile 外,CocoaPods 还会生成一个名为Podfile.lock的文件,Podfile.lock应该加入到版本控制里面,不应该把这个文件加入到.gitignore中。因为Podfile.lock会锁定当前各依赖库的版本,之后如果多次执行pod install不会更改版本,要pod update才会改Podfile.lock了。这样多人协作的时候,可以防止第三方库升级时造成大家各自的第三方库版本不一致

Podspec

该文件描述了一个库将怎样被添加进工程中。.podspec文件可以标识该第三方库所需要的源码文件、依赖库、编译选项,以及其他第三方库需要的配置。

CocoaPods 安装(以下步骤都是终端操作)

1、升级Ruby环境

输入:gem update --system

如果出现:

ERROR:  While executing gem ... (Gem::FilePermissionError)
 
You don‘t have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

则输入:sudo gem update —system

2、替换镜像路径
原镜像路径是https://rubygems.org/,由于被墙了下载安装会炒鸡慢,所以替换成淘宝的Ruby镜像会快很多。

步骤(1):gem sources --remove https://rubygems.org/

步骤(2):gem sources -a https://ruby.taobao.org/

今年的淘宝Ruby镜像路径用了Https,如果使用原来的http路径则要替换,不然会出现如下错误:
ERROR: Could not find a valid gem 'cocoapods' (>= 0), here is why:
      Unable to download data from http://ruby.taobao.org/ 
      - bad response Not Found 404 (http://ruby.taobao.org/latest_specs.4.8.gz)

可以输入gem sources -l查看是否替换成功

3、安装

步骤(1):sudo gem install cocoapods

步骤(2):pod setup

CocoaPods 使用

步骤(1):cd 项目路径,只到项目的一级路径即可,如cd /Document/Work/Demo

步骤(2):pod init

步骤(3):编辑Podfile文件,可用文本编辑器打开也可用vim,添加需要的第三方类库。

格式一般为`pod 'AFNetworking', '~> 2.6.0'`,放在`target 'Demo' do`与对应的end之间。
如果只是用`pod 'AFNetworking'`则会使用最新的版本。

参考格式:

# platform :ios, ‘7.0’

target 'Look' do
    pod 'MJRefresh'
    pod 'SDWebImage', '~> 3.7.3'
    pod 'AFNetworking', '~> 2.6.0'
    pod 'SVProgressHUD', '~> 1.1.3'

    # Pods for Look

    target 'LookTests' do
        inherit! :search_paths
        # Pods for testing
    end

    target 'LookUITests' do
        inherit! :search_paths
        # Pods for testing
    end
end

步骤(4):pod install,执行这一步会比较久,因为需要下载相应的类库

安装完成后应该打开Demo.xcworkspace而不是Demo.xcodeproj了。

其他技巧或问题解答

Tip1、 pod search AFNetworking:如果CocoaPods支持,将会输出搜索到的所有类库版本和信息,以及在Podfile中配置的写法,终端返回信息如下:

-> AFNetworking (2.3.1)

   A delightful iOS and OS X networking framework.

  pod ‘AFNetworking‘, ‘~> 2.3.1’(这个语句是需要在编辑Podfile的时候输入的命令,即是如何安装下载相关类库的指令)

   - Homepage: https://github.com/AFNetworking/AFNetworking

   - Source:   https://github.com/AFNetworking/AFNetworking.git

   - Versions: 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0,

   2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3,

Tip2、 所有的项目的 Podspec 文件都托管在https://github.com/CocoaPods/Specs。第一次执行pod setup时,CocoaPods 会将这些 podspec 索引文件更新到本地的~/.cocoapods/目录下,这个索引文件比较大,有 80M 左右。所以第一次更新时非常慢.

一个叫 akinliu 的朋友在 gitcafe 和 oschina 上建立了 CocoaPods 索引库的镜像,因为 gitcafe 和 oschina 都是国内的服务器,所以在执行索引更新操作时,会快很多。如下操作可以将 CocoaPods 设置成使用 gitcafe 镜像:

pod repo remove master
pod repo add master https://gitcafe.com/akuandev/Specs.git
pod repo update

将以上代码中的https://gitcafe.com/akuandev/Specs.git替换成http://git.oschina.net/akuandev/Specs.git即可使用 oschina 上的镜像。


Q2、当在pod updatepod install时遇到:

Unable to find a specification for `xxxxx (~> 1.x.x)` depended upon by Podfile.  

OR :pod setup时遇到:

[!] /usr/bin/git fetch --unshallow

fatal: error in object: unshallow f4cf991d7db93e387c25a637876d473fe7093a6d

A2:只需要把当前Pod的目录清理一下就O了

步骤(1):pod repo remove master

步骤(2):pod setup


Q3、当把CocoaPods生成的workspace移动到上层目录时,需要改下Pods.xcconfig和工程里的一些设置, 故当遇到:

Could not automatically select an Xcode project. Specify one in your Podfile like so:  
  
xcodeproj 'path/to/Project.xcodeproj'  

A3:在Podfile文件里指定下工程目录就O了,比如:

......  
xcodeproj 'Portfolio/Portfolio.xcodeproj'   
......  

Q4、当在pod updatepod install时卡在Analyzing dependencies

A4:当执行以上两个命令的时候会升级CocoaPods的spec仓库,加一个--verbose --no-repo-update可以省略这一步,然后速度就会提升不少。命令如下:

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

CocoaPods 进阶

对自己的开源项目引入CocoaPods支持

讲了那么多怎么用别人的,那这一节可以来看看怎么自己做给别人用了,如果你有一个开源项目,想让别人也能使用 CocoaPods 直接导入,那么可以这样做。

英文好的大哥大姐们 => 传送门:CocoaPods官方文档说明

1、在github上创建一个仓库,比如CNTestDemo,重要:记得选择开源协议(MIT)

2、将项目clone到自己的工作目录,至于Git的使用这里就不说了,如果不了解的可以先看看这里:
廖雪峰--Git教程

3、创建 podspec 文件:

cd /Document/Work/iOS/CNTestDemo
pod spec create CNTestDemo

4、编辑 podspec 文件: vim CNTestDemo.podspec

5、创建之后会自动生成一个模板,里面会有详细的注释(可以参考别的开源项目的podspec文件),这里给出一个示例文件:

Pod::Spec.new do |s|
  s.name     = 'CNTestDemo' 
  s.version  = '1.0' 
  s.license  = "MIT"  //开源协议
  s.summary  = 'This is a test demo' //简单的描述 
  s.homepage = 'https://github.com/neilchan/CNTestDemo' //主页
  s.author   = { 'Neil Chan' => '***@yeah.net' } //作者
  s.source   = { :git => 'https://github.com/neilchan/CNTestDemo.git', :tag => "1.0" } //git路径、指定tag号
  s.platform = :ios 
  s.source_files = 'CNTestDemo/*'  //库的源代码文件
  s.framework = 'UIKit'  //依赖的framework
  s.requires_arc = true
end

6、创建tag,同步到github:

git add .
git commit -m "1.0"
git tag 1.0
git push --tags
git push origin master

7、验证podspec文件

pod spec lint CNTestDemo.podspec

如果不通过根据提示解决错误之后,返回步骤6。在这之前要删除github跟本地的tag,输入:

git tag -d 1.0                   //删除本地tag
git push origin :refs/tags/1.0  // 删除github仓库tag

8、注册 CocoaPods 信息(第一次提交的话,不是的话跳过)

pod trunk register 这里写邮箱 '这里起个名字' --description=' 这里写描述'

去邮箱点击验证链接之后,再执行第9步骤

9、提交到 CocoaPods

pod trunk push CNTestDemo.podspec

到这里提交完成之后就可以通过 CocoaPods导入或者查找你的开源项目了。

建立企业内部私有库

看到标题莫慌,其实不是什么大事儿。只是你只需要执行完上述说到的第7步骤,就不推到 CocoaPods 的公共资源列表去了就行。而在使用的时候你需要在 Podfile 中这样写:

pod 'ProjectName',:git=>"http://xxx.git"(把xxx替换为库的git地址)

这里感谢:

CocoaPods 官方文档

用 CocoaPods 做iOS程序的依赖管理

如何编写一个CocoaPods的spec文件

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

推荐阅读更多精彩内容

  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 20,524评论 0 39
  • CocoaPods 是什么? CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具。CocoaPo...
    朝洋阅读 25,476评论 3 51
  • 一. CocoaPods的介绍 什么是CocoaPods?CocoaPods是一个负责管理iOS项目中第三方开源库...
    辉712阅读 3,873评论 0 7
  • 我想你应该不喜欢我,不然怎么会没有一通电话;我想你应该不喜欢我,不然怎么会漠不关心;我想你应该不喜欢我,不然怎么会...
    慢慢姑娘阅读 737评论 0 1
  • “不管是回到过去,还是去往未来,结果都不能使现实得到丝毫改变,那么你还会想要去吗”? 同事把一本书递给我,然后告诉...
    无限意无线意阅读 237评论 0 0