1. 背景

CocoaPod是Swift,Objective-C语言编写的Cocoa项目的依赖管理工具。简单点说就是它管理了很多的Swift和Objective-C的库,然后通过CocoaPod可以比较容易的在自己的项目中引用与管理它所提供的各种库。CocoaPod本身是用Ruby开发的,可以在Mac默认的Ruby环境下运行(官方也推荐用Mac默认环境运行)。它本身也是被Ruby的包管理工具Gem所管理。这里其实有点绕,Ruby下面的包管理工具Gem下管理了CocoaPod包,而CocoaPod自身可以认为是一个Swift/Objective-C依赖包管理工具,它管理了很多Swift/Objective-C的库。

2. 安装

我们可以通过Gem install命令来安装Cocoa Pod,但是受国内防火墙影响,可能访问不了Gem国外的源。因此我们需要更改Gem的源为国内的提供商。可选提供商如下:

1. https://ruby.taobao.org

2. https://gems.ruby-china.org

可以通过gem source add {source uri}来添加

添加好源后,我们即可通过sudo gem install cocoapods来安装cocoapod.

安装好后,我们即可使用cocoapod来管理我们的依赖库

3. Podfile

cocoapod是通过podfile来描述项目所以依赖的库,具体文件内容如下:

# Uncomment this line to define a global platform for your project
platform :ios, '9.0'
use_frameworks!//使用framework的方式来引用依赖库 target ‘CocoaPodTest’ do//为项目的该targe定义依赖
pod ‘SwiftyJSON’//为项目添加SwiftJSON的依赖,版本为最新版
end

可以在project所在目录执行pod init命令,来让pod为我们创建podfile文件,也可以自己手动创建,然后添加自己所依赖的库。

4. 拉取依赖库

podfile准备好后,通过命令pod install命令(在podfile所在目录执行)来安装项目所以来的库。

注意:当后续添加/删除了库的依赖后,依然是通过pod install来拉取,只有当需要更行所依赖的库的版本的时候才执行pod update命令来更新依赖库的版本

5. pod install后生成的文件分析以及cocoa pod的工作原理

先来看一下整体结构:

CocoaPodTest project
-Depended on
--Pods_CocoaPodTest.framework

Pod project
-Target
--Pods_CocoaPodTest
--SwiftJSON

新生成了一个Pod project,它有两个targets:Pods_CocoaPodTest,SwiftJSON,依赖于SwiftJSON
我们的项目CocoaPodTest依赖与Pod project的Pods_CocoaPodTest target的产出Pods_CocoaPodTest.framework
这样我们自己的项目就只依赖与Pods_CocoaPodTest.framework,然后其它所有引入的库由Pod_CocoaPodTest target触发编译。减少对我们自己Project的修改。

除了这些target的配置外,从上面的图可以看出在Support文件夹里面生成了很多文件。主要是三类文件:

1. Module定义文件

为了让我们引入的每个库的我们的项目代码中能以Module的形式应用,CocoaPod将每一个库输出为一个framework,这些Module定义文件定义了framework的module.

2. target的编译配置文件*.xcconfig
这些定义每一个target的xcode编译配置。

3. 编译脚本
我们如果查看CocoaPodTest project的的build phase,可以看到

cocoa pod为我们添加了三个build phase:

1. Check Pods Manifest.lock

这个环节利用根目录里面的manifest.lock文件和上级目录中的podfile.lock,来确保多人协同开发时,每个人本地的库版本一致。具体原理如下:

1)pod install或者pod update后,cocoa pod会更新manifest.lock和podfile.lock,根文件保存了所依赖库的版本信息

2)将podfile.lock提交至源码管理系统

3)其他人拿到代码后,如果本地的库版本与提交至源码管理系统的podfile.lock所描述的不一样。编译会失败,报告本地需要通过pod install/pod update来更新库文件。达到保证多人开发时版本一致的目的。

2. Embed Pods Frameworks

这个环节会去执行Pod所生成的编译脚本Pods-CocoaPodTest-frameworks.sh,主要是对所生成的依赖库的framework进行签名等。

3. Copy Pods Resource

这个环节会去执行Pod所生成的编译脚本Pods-CocoaPodTest-resources.sh,来拷贝所依赖库中的资源文件。

Cocoa Pod使用总结的更多相关文章

  1. Cocoa pod的使用注意点

    一.CocoaPods是什么? CocoaPods是一个负责管理iOS项目中第三方开源库的工具.CocoaPods的项目源码在Github上管理.该项目开始于2011年8月12日,在这两年多的时间里, ...

  2. Cocoa pod导入第三方框架遇到的那点事儿

    废话不多说,直接上干货. 以下所有操作均是在Cocoapod导入第三方库,并且是.xcworkspace的工程里面操作的, 1.导入头文件找不到,也就是所谓的,not find ''AFNetwork ...

  3. How Cocoa Beans Grow And Are Harvested Into Chocolate

    What is Cocoa Beans Do you like chocolate? Most people do. The smooth, brown candy is deliciously sw ...

  4. OS X EI Capitan 系统 安装cocoapod

    没有废话直接上步骤    (哪一步卡住了 多试几次 可能是网络不好的缘故) 1. 首先安装 home-brew   以下方法转自:http://www.cnblogs.com/lzrabbit/p/4 ...

  5. iOS开发之网络篇-CocoaPods的安装 EI Capitan 10.11 之前的方式

    注意:此种方式,在苹果系统 EI Capitan 10.11  之前的版本,新版本有所不同 一.安装 1> 查看gem源 $ gem sources –l 2> 删除源 (因为本人是第N次 ...

  6. Swift调用Objective C的FrameWork

    很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...

  7. iOS之Cocoapods安装

    网上关于cocoapods的教程很多,关于它的优点我不赘述:但是我根据多次安装的经验,把我遇到的问题写一下,希望对新手有所帮助. 1. 设置输入源(由于默认的gem资源是国外的,由于历史原因,访问比较 ...

  8. Mapbox使用详解

    一.简介: Mapbox致力于打造全球最漂亮的个性化地图.   在一次偶然的地图相关资料搜索过程中发现了一个很神奇又很漂亮的地图,这个地图支持高度自定义各种地图元素,比如,道路,水系,绿地,建筑物,背 ...

  9. iOS 上传自己的库到cocoapod

    最近自己写了个库,传到github上,想让自己的库支持cocoapod,这里我看了很多相关文章.下面我就写下详细步骤以及会遇到的问题. 我们会使用trunk的方式提交到cocoa pod 这是2014 ...

随机推荐

  1. 【P2944】地震损失(最大流,洛谷)

    绝对难度虚高的一题 看到题目,至少损坏几个房子,开始考虑最小割,建的是双向边,所以拆点,边权除了自己与自己的之外都连inf.然后把所有求救的点都连到超级源上,跑一遍最大流就可以了. #include& ...

  2. java可变参数列表的实现

    参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数, ...

  3. php中POST与GET区别

    如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...

  4. mysql升级的一些踩坑点

    升级的方法一般有两类: 1.利用mysqldump来直接导出sql文件,导入到新库中,这种方法最省事也最保险 缺点:大库的mysqldump费时费力. 2.直接替换掉 mysql 的安装目录和 my. ...

  5. spring mvc:拦截器不拦截静态资源的三种处理方式

    方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/* ...

  6. mysql数据库(三):查询的其他用法

    一. 查询—IN的用法 语法:select ... from 表名 where 字段 a in (值b, 值c, 值d...) 等价于 select ... from 表名 where 字段a=值b ...

  7. Light oj 1074 spfa

    https://vjudge.net/problem/LightOJ-1074 首先吐槽一个单词,directional是有方向的,undirectional是无向的,这个unidirectional ...

  8. pxcook-高效易用的自动标注工具, 生成前端代码

    1.pxcook.sketch(http://www.fancynode.com.cn/pxcook)

  9. HTTP metadata数据

    信息元位置 信息元名称 信息元ID 信息元描述 1 MetadataVersion 5000 Metadata版本号 当前版本号为1.0 2 MetadataID 1019 MetadataID 3 ...

  10. [转载]java操作word生成水印

    应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...