CocoaPods

CocoaPods简介

在进行iOS开发的时候,一定离不开第三方库的使用,如果没有CocoaPods,我们将要进行的工作是:

  1. 下载源代码
  2. 引入工程
  3. 向工程中添加开源库使用的framework
  4. 解决依赖问题
  5. 检查重复添加的framework
  6. 如果需要更新,重复以上步骤

但是现在CocoaPods已经帮我们把上面的动作执行了,我们只需要执行配置podfile等工作,其他的都不用亲自操作了
CocoaPods就是一个管理第三方依赖库的工具 ,它在执行第三方库配置的同时会为我们创建一个workspace文件来将第三方库和我们的工程连接起来,供我们开发使用。其存在的目的就是让开发者能自动化、集中的、直观的管理第三方开源库

CocoaPods结构

CocoaPods是用Ruby写的,并由若干个Ruby包构成

  1. CocoaPods/Specs
    是保存podspec文件的仓库,每引入一个第三方库,都会传一份podspec文件给CocoaPods,在这里面会有每个第三方库的每个版本,在podspec文件中会有source属性,通过source属性中的链接去下载该第三方库
    Specs采用集中式管理
    tips:打开隐藏文件夹的方式shift+command+.
    在这里插入图片描述

  2. CocoaPods/CocoaPods
    是一个面向用户的组件,每当执行一个pod命令时,这个组件都会被激活。

  3. CocoaPods/Core
    这个gem组件提供支持与CococaPods相关文件的处理。比如,执行pod install命令,Core组件会解析podspec文件和podfile文件,确定引入的文件。除此之外,执行与这些文件相关的命令也由该组件处理,比如pod spec lint,检测podspec文件的有效性

  4. CocoaPods/Xcodeproj
    CocoaPods中负责所有工程文件的整合。如果想写一个脚本来方便的修改文件,可以单独下载这个gem文件并使用

集成CocoaPods之后,只能使用workspace

因为workspace下的project会共享build(通常为 ~/Library/Xcode/DerivedData/),Xcode通过这种方式发现隐式依赖并按序构建。如果使用project就得手动将pod工程的产物拖入到link library with libraries添加引用,并拷贝modulemap等文件

podfile.lock

生成:在第一次pod install时自动生成,会标注项目当前依赖库的准确版本(包括podfile中直接标注需要使用的库和这些库依赖的其他库)
改变:在执行pod update命令或修改podfile文件里使用的依赖库后会生成新的podfile.lock文件
好处:如果是多人共同开发,那么别人同步了你的podfile.lock之后,直接执行pod install就可以保证你们的库是同一版本的,是同步的,可以防止因为依赖库版本不同而产生的问题
例子:甲乙使用两个分支开发,甲添加了A库,在podfile中指定版本1.0.1,A1.0.1依赖于B库,但是没有指明版本dependency 'A1', '~> 3.0'CocoaPods会使用满足条件的最新版本,比如B 3.2。等乙在合并分支的时候,B已经有了3.3版本,CocoaPods会使用B3.3版本,同样的podfile,安装的版本不同。但是如果使用podfile.lock的话,会记录你目前使用的库的准确版本,并且配置时也使用这个版本,就不会出错

manifest.lock

manifest.lockpodfile.lock文件的副本,在pods/文件夹下,没有纳入git的版本控制,只有本地的改动会影响该文件,而podfile.lock是会被别人的改动影响的。在项目bulid时,如果两个文件不同就会报the-sandbox-is-not-in-sync-with-the-podfile-lock
这个文件的目的是:在多人开发时的各个同伴都能及时知道依赖库更新了(podfile.lock文件和manifest.lock文件不同,也就是当前podfile.lock文件和上次安装pod后的podfile.lock不同),及时更新,防止依赖库版本不同造成的崩溃

pod命令们

第三方库安装时会在其对应的podspec文件中找到它的resource属性,在那里下载它的对应源,podspec文件存储在repo

pod install

只会改变podfile中新改变的东西
执行过程:

  1. 如果podfile.lock存在,直接从文件中读取信息下载,只会下载文件中指定版本,对于不在podflie.lock文件中的库,pod install命令会搜索这个pod库在podfile文件中指定的版本来安装,在安装之后会根据podfile中的描述解析,并在podfile.lock中增加对应的内容
  2. 如果podfile.lock不存在,会读取podfile文件内的框架信息,下载好之后生成podflie.lock文件
  3. 生成或更新podfile.lock文件后,都会生成一个与之相同的manifest.lock文件

pod repo update

从远程仓库更新本地的repo(同步)

pod update

首先执行pod repo install,接着会根据podfile的规则更新所有库,不会理睬podfile.lock,根据安装后的情况生成新的 podfile.lock

今天碰到的问题

我和同学共用一个子分支,他昨天合并了develop分支,今早我pod install报错,pod repo update后就可以pod install
原因:比如同学合并了分支后的A库版本是1.0.2,而我本地podspec文件中只有1.0.1版本,拿不到resource属性中的对应源,无法下载。这时候就得同步远程仓库,将远程仓库中的podspec文件clone到本地,之后pod install就可以了

参考链接

我所理解的CocoaPods
关于podfile.lock带来的痛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值