Cocoapods完整使用篇
温馨提示:在篇文章中所使用的Xcode版本为Xcode7.
一、什么是CocoaPods?
简单来说,就是专门为iOS工程提供对第三方库的依赖的管理工具,通过CocoaPods,我们可以单独管理每个第三方库,可以更方便地管理每个第三方库的版本,而且不需要我们做太多的配置,直接交由提供支持CocoaPods项目的作者来配置了,如此便可直观、集中和自动化地管理我们项目的第三方库。
二、为什么需要使用CocoaPods?
我们也许有过这样的感受:
每添加一个第三方库、Framework或者SDK,我们都需要手动添加相关依赖库,在工程buildsetting中配置路径,在build phases中添加依赖的系统库。如果所导入的第三方库还依赖其他第三方库,我们也需要手动导入且分别添加工程配置。
当我们需要更新某个第三方库的时候,我们又要手动移除该库,导入新的库,然后再配置,这是相当麻烦且没有意义的工作。当使用CocoaPods管理后,我们只需要修改为某个版本,再执行pod update即可。
当我们需要去掉某个第三方库时,我们是怎么做的呢?是不是将该库移除掉,然后还得把相关配置也移除掉,这样工作才干净。是不是很麻烦呢?当我们使用Cocoapods管理后,我们是怎么做的?只需要在Podfile删除该引入该库的语句,然后执行pod update即可。
当我们开始使用CocoaPods管理第三方库后,我们只需要相当少的配置,其它的一切都交由CocoaPods来管理即可,我们使用起来就更省心了。
三、如何安装CocoaPods?
CocoaPods is built with Ruby and is installable with the default Ruby available on OS X. We recommend you use the default ruby.
CocoaPods是通过Ruby来安装的,MAC OSX都有一个默认的Ruby版本,推荐我们通过默认的Ruby来安装CocoaPods。
使用下面的命令安装:
事实上,这样安装未必能安装成功,因为默认的cocoapods网址是国外的,需要VPN才能访问,因此我们可以改一种方式:
1、先输入 gem sources --remove https://rubygems.org/
2、等待有反映后,再输入 gem sources -a http://ruby.taobao.org/
3、验证是否成功替换:gem sources -l
4、最后就可以通过sudo gem install cocoapods正常安装cocoapods了。
等待安装完成后,就可以开始使用CocoaPods了。
四、如何使用CocoaPods?
要使用CocoaPods,就需要一个Podfile文件。看下图,我们是如何为所有的工程建立Podfile的,下面的方式是基本的方式。
第一步:进入到我们所建立的工程的目录,这里是KVODEMO
第二步:通过touch命令新建Podfile
第三步:通过vi Podfile进入编译Podfile
第四步:添加第三方库,如下图,我们添加了AFNetworking和ObjectiveSugar库,其中我们添加的AFNetworking版本是2.0版本,ObjectiveSugar版本是0.5.
按下esc键,然后输入:wq,就可以保存了。然后在终端输入pod install,就可以安装第三方库了。
在安装完成后,我们不再是打开后缀为.xcodeproj的工程,而是打开后缀为.xcworkspace的工作空间了。
关于Podfile更高级的使用,请参考官方文档:https://guides.cocoapods.org/using/the-podfile.html
1)、在Objective-C工程中的使用
在工程中,我们只需要通过引入改文件就可以直接使用了,比如我们引入了第三方库Masonry(纯代码自动布局),我们在Objective-C工程中就可以通过import头文件即可。
注意,如果这么做提示找不到头文件,那么我们可以尝试这么引入:
#import "Masonry.h"或者通过#import "Masonry/Masonry.h"
如果仍然没有效果,那么需要在工程配置一下:
在工程的Build Settings搜索Search Paths,然后在User header search paths中添加$(SRCROOT)并选择recursive(也就是递归查找)
2)、在Swift工程中的使用
我相信大家在Swift工程中使用CocoaPods也遇到了不少问题,尤其是如何import模块问题。
当初我遇到这种问题时,也在网上搜索了很多的资料,但是都不是我希望的方案。在网上有两种方式:
通过Swift工程可以桥接Objectice-C的方式,建立一个Bridge-head.h(名字随便起),然后进入到Build Settings,在搜索框中输入bridg,找到Objective-C Bridging Header,选项,把头文件的路径赋值给该选项。如图所示:
也就是:工程名/桥接文件名.h。
在刚才所建立的桥接文件中,通过#import "头文件.h"就可以了。
虽然是Objective-C第三方库,事实上我们也可以使用Swift的方式引入的,也就是通过 import 模块名 的方式来引入。所以对于上面的方式,我是不喜欢的。那么再看看网上的另一种方式。
原文链接:http://blog.shiqichan.com/How-To-Import-3rd-Lib-Into-Swift-Project/
这是通过submodule的方式来管理的。
创建submodule,在当前项目的同级目录下执行类似这样的命令。
将生成的Masonry.xcodeproj拖入到工程中,类似下图:
在xcode工程的general中,点击embeded libraries中的+号,然后改我们的第三方库framework,类似下图:
最后就可以直接在工程中需要使用的地方,通过import 模块名来使用了。类似下图:
如果是多人团队开发,我们就需要共享了,那么其他成员就需要通过下面的命令来安装:
这是通过递归来安装或者更新submodule。这是挺麻烦的一件事。然后根据使用的经验,我们下载别人的工程下来后,执行了上面的命令,安装好相关模块了,运行工程经常出现报错的问题,也就是配置问题。因此,个人很不喜欢这种方式。
事实上,在Xcode7是不再需要这么做了,对于其他Xcode版本是否需要,未验证。
我们通过cocoapods安装的第三方库会自动生成为framework,然后我们只需要在使用的地方直接通过import 模块名使用即可。但是有时候可能会出现某个第三方库直接通过import 模块名时,提示找不到,也就是没有智能提示。这时候我们可以通过在xcode工程的general中的embeded libraries点击+,然后导入该framework,就可以正常import了。另外如果导入的第三方库在运行时,报错了,类似于:
dyld: Library not loaded: @rpath/ReactiveCocoa.framework/ReactiveCocoa
Referenced from: /private/var/mobile/Containers/Bundle/Application/31ABC86A-C1BD-40DD-A117-D2C8F79A98FE/SwiftGithubClient.app/SwiftGithubClient Reason: image not found
那么我们可以这么解决:
在Build Phases->Link Binary With Libraries->找到出错的库的名称->修改required为optional即可。
五、如何升级CocoaPods版本?
升级CocoaPods是非常简单的,只需要一个命令即可。
正常情况下,只需要一个命令就可以升级了:
但是有可能需要更新gem才能升级cocoapods,因此我们可能需要这么做:
参考:http://www.cnblogs.com/brycezhang/p/3675670.html
六、如何让自己的开源项目支持CocoaPods?
1、第一步:打开终端并进入到工程的目录。这里是我所开源的一个HYBMasonryAutoCellHeight开源库,用于自动计算cell的高度。
2、第二步:创建一个Podspec文件。通过命令pod spec create创建。
3、第三步:编辑该podspec文件。
大家会看到,这自动生成的已经是一个模板了,我们需要做的就是修改相关内容,补充内容就可以满足我们的需求了。对于更高级的使用,就需要参考官方文档,一步步地学习使用了。
看看我所提供的第三方库的podspec文件的配置,看一看:
这一步很关键,需要配置的东西比较多。主要是s.source这里必须提供我们的git路径、指定tag号和s.source_files这里必须指定库的源代码文件。通常我们会把我们的库放到与Demo工程的.xcodeproj同级,比较这里的HYBMasonryAutoCellHeight目录是与.xcodeproj是同级的父级目录,然后我们就可以更简单的设置了。然后我们在设置s.source_files时,第一个就设置为HYBMansonryAutoCellHeight,第二个就是设置为所有的.{h,m}类型的文件。对于比较复杂的设置,可以参考AFNetworking中的podspec文件。
如果我们的开源库依赖系统库怎么办?
# s.framework = 'SomeFramework'// 去掉#,设置依赖的系统库名称
# s.frameworks = 'SomeFramework', 'AnotherFramework'//设置多个系统库名称
# s.library = 'iconv'// 设置只依赖一个系统的library
# s.libraries = 'iconv', 'xml2' // 设置依赖多个系统的library
# s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }// 这里是工程配置,这样使用者就不需要手动处理,由pod自动处理了。
如果的开源库依赖其他第三方库,怎么办:
s.dependency 'JSONKit', '~> 1.4'//设置我们的开源库依赖哪些第三方库和依赖的版本号。
4、第四步:这里呢,我们设置的版本号为0.0.1,那么tag号为0.0.1,因此我们还需要新建一个tag,名为0.0.1,然后推到git:
接下来,我们需要验证我们的配置是否正确:
当然我们还可以直接使用:pod lib lint来验证所有。
如果验证通过,会出现这样的提示:
-> HYBMasonryAutoCellHeight (0.0.1)
HYBMasonryAutoCellHeight passed validation.
如果刚才我们的配置出错,或者需要修改一些内容,重新再推,则可以先删除远程的tag 0.0.1,然后在修改后,重复上面的第四步。下面是删除远程tag命令:
6、第五步:在验证通过后,提交到cocoapods。也就是通过命令pod trunk push 库名.podspec来推送到远程的cocoapods:
如果出现警告,需要修改相关内容以去掉警告。当操作成功后,我们就可以通过pod search命令来搜索我们的库了。
更详细地使用,请参考官方文档 :https://guides.cocoapods.org/making/making-a-cocoapod.html
这里有一篇文章,写得相当不错:http://www.exiatian.com/cocoapods%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E5%8F%8A%E9%85%8D%E7%BD%AE%E7%A7%81%E6%9C%89%E5%BA%93/
七、如何生成Cocoapods私有库?
要让自己的库变成私有库,那么我们的代码也是需要通过git来管理的。
这里假设我们新建了一个工程,名叫BookEffect,然后已经push到git远程服务器。
第一步:按照第六节一样,创建好podspec文件,并将整个工程推送到git服务器这边。
第二步:这才是引入私有库的方式。pod 'DemoLib',:git=>"http://xxxxx.git"(替换为真实的git地址)
具体不细说,请参考:http://www.cnblogs.com/superhappy/p/3468377.html
八、使用Cocoapods打包静态库
这里就不细说,不过推荐一篇文章:http://www.cnblogs.com/brycezhang/p/4117180.html写得很不错。
最后,感谢各位认真阅读本篇文章,感谢您的支持。如想学习更多,请关注微信公众号:iOSDevShares。
参考:https://cocoapods.org/?q=blocksk
Cocoapods完整使用篇的更多相关文章
- JMeter性能测试,完整入门篇
1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免费,也越来越流行成为了主流的性能测试工具 ...
- JMeter性能测试,完整入门篇(转)
原文转自:https://blog.csdn.net/lovesoo/article/details/78579547 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件 ...
- IOS安装CocoaPods完整流程
作为一个底层系统大菜鸟,又搞过几年ios来说,安装一个CocoaPods是一件蛋痛的事~ 说懂又懂,说不懂又不懂. 由于安装过程比較复杂,步骤较多,而网上教程又比較零散,并且有一些是扯蛋的,所 ...
- 大数据学习笔记——Linux完整部署篇(实操部分)
Linux环境搭建完整操作流程(包含mysql的安装步骤) 从现在开始,就正式进入到大数据学习的前置工作了,即Linux的学习以及安装,作为运行大数据框架的基础环境,Linux操作系统的重要性自然不言 ...
- 零基础学习openstack【完整中级篇】及openstack资源汇总
1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ...
- Nginx 完整安装篇
第一步安装各种编译库如c++编译库等 yum install -y gcc //安装GCC ...安装过程省略 yum install -y gcc-c++ //安装C++库用来编译c++ ...安装 ...
- 【原】iOS:手把手教你发布代码到CocoaPods(Trunk方式)
Change Log: 2015.08.20 - 添加podspec文件更新方法 2015.08.19 - 首次发布 概述 关于CocoaPods的介绍不在本文的主题范围内,如果你是iOS开发者却不知 ...
- << CocoaPods安装和使用教程 >>github code4app以及cocoachina 苹果官方文档
developer.apple.com 英文搜索各个技术的官方介绍文档, 前提是英文过关 cocoachina ios最新新闻, 信息 code4app上有许多组件 http://www.code4a ...
- 用CocoaPods做iOS程序的依赖管理(转摘)
转摘自:http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/ 文档更新说明 2012-1 ...
随机推荐
- DBus介绍
1. 介绍 DBus是一种桌面环境的进程间通讯(IPC)机制,有低时延.低消耗等优点 基于socket,提供了一对一的对等通讯:使用dbus-daemon作为后台进程时,可实现多对多通讯 由如下三个层 ...
- synchronous interrupt and asynchronous interrupt
Asynchronous interrupt 中斷请求信号来自CM3内核的外面,来自各种片上外设和外扩的外设,对CM3来说是"异步"的: e.g. usb otg device S ...
- [SaltStack] Minion-conf自动更新
minion-conf配置文件自动更新, 加载 minion-conf是每个minion自身以来的配置, 为了方便我们在中心管控机上(Master)统一配置, 然后下发文件, 进而使得Minion能够 ...
- c#反射,委托,事件
1.反射,通过类名来实例化类 //用构造函数动态生成对象: Type t = typeof(NewClassw); Type[] pt = ]; pt[] = typeof(string); pt[] ...
- 阿里云服务器 centos 7 安装postgresql 11
Postgresql简介 官方网站:https://www.postgresql.org/ 简介参考zhihu文章 https://www.zhihu.com/question/20010554 关于 ...
- 使用PyQt4制作一个正则表达式测试小工具
最近在做一些网络爬虫的时候,会经常用到正则表达式.为了写出正确的正则表达式,我经常在这个网站上进行测试:Regex Tester.这个页面上面一个输入框输入正则表达式,下面一个输入框输入测试数据,上面 ...
- IIS 发布双证书
1.端口都用443 2.配置主机名 3.勾选需要服务器名称指示
- 洛谷——P2383 狗哥玩木棒
P2383 狗哥玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第 ...
- POJ 3254 Corn Fields [DP]
题意:略. 思路:第一次做状态压缩的dp. 在这里说一下状态压缩的原则.因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量 ...
- Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
这一篇文章是继http://www.cnblogs.com/EasonJim/p/5954155.html的升级版,由于CCNET已经过时,所以我把打包过程的CCNET工具换成Jenkins去实现,批 ...