CocoaPods 原理分享及遇到的问题改进
cocoapods 原理分享及问题阐述
- cocoapods 管理私有工程,需要两个git 仓库,
- repo 仓库,保存podspec 文件,告诉我们项目从哪来,
- 项目 仓库,保存工程文件,告诉我们引用的项目是什么
- CocoaPods是用ruby写的,并由若干个ruby包(gems)构成。在解析整合的过程中,最终要的几个gems分别是:
- CocoaPods/CocoaPods、
- 这是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用CocoaPods涉及到的功能,并且还能通过调用左右其他的gems来执行任务。
- CocoaPods/Core
- Core组件提供支持与CocoaPods相关文件的处理,文件主要是Podfile和podspecs。
- podfile 用于定义项目中所需要使用的第三方库。
- podspec 描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等
- Core组件提供支持与CocoaPods相关文件的处理,文件主要是Podfile和podspecs。
- CocoaPods/Xcodeproj。
- 这个gem组件负责所有工程文件的整合。它能够对创建修改xcodeproj 和 .xworkspace 文件。它也可以作为一个单独的gem包使用。如果你想要写一个脚本来方便的修改工程文件,那么可以使用这个gem。
- CocoaPods/CocoaPods、
- pod 常用命令
- pod install
这个是第一次在工程里面使用pods的时候使用,并且,也是每次你编辑你的Podfile(添加、移除、更新)的时候使用。
每次运行pod install命令的时候,在下载、安装新的库的同时,也会把你安装的每个库的版本都写在了Podfile.lock文件里面。这个文件记录你每个安装库的版本号,并且锁定了这些版本。
- 当你使用pod install它只解决了pods里面,但不在Podfile.lock文件里面的那些库之间的依赖。对于在Podfile.lock里面所列出的那些库,会下载在Podfile.lock里面明确的版本,并不会去检查是否该库有新的版本。对于还不在Podfile.lock里面的库,会找到Podfile里面描述对应版本(例如:pod "MyPod", "~>1.2")。
- 一句话总结:
- 如果没有 podfile.lock,pod install 会依据podfile生成库和podfile.lock;
- 如果原有 podfile.lock,pod install 依据podfile.lock生成库,对于不在podfile.lock但在podfile中的库会升级到满足podfile的最新版本,同时更新podfile.lock
- pod outdated:
- 当你运行pod outdated命令,CocoaPods会列出那些所有较Podfile.lock里面有新版本的库(那些当前被安装着的库的版本)。这个意思就是,如果你运行pod update PODNAME,如果这个库有新的版本,并且新版本仍然符合在Podfile里的限制,它就会被更新。
- pod update
当你运行 pod update PODNAME 命令时,CocoaPods会帮你更新到这个库的新版本,而不需要考虑Podfile.lock里面的限制,它会更新到这个库尽可能的新版本,只要符合Podfile里面的版本限制。
- 如果你运行pod update,后面没有跟库的名字,CocoaPods就会更新每一个Podfile里面的库到尽可能的最新版本。此时会生化新的podfile.lock文件
- 一句话总结:pod update 依据podfile文件更新库和podfile.lock
- pod update的执行过程大概分五步
- resolve_dependencies,又简单的分为两步
- update repo
- 解析podfile
- download_dependencies (下载podfile中依赖以及其间接依赖)
- generate_pods_project (即生成dependency在Pods工程中的target,以及写pod file.lock等文件)
- integrate_targets
- peform_post_install_actions
- 具体的时间消耗如下所示:
- resolve_dependencies,又简单的分为两步
- 使用过程中遇到的问题:
- 为什么我们在子工程中增加删除文件,其他人必须pod update 一下,才能顺利编译?
- 这是因为我们采用了git + cocoapods的管理方式,git 负责管源文件, 通过git pull 来同步远程代码, 而cocoapods 通过pod update/install 会生成pod.xcworkspace来管理这些文件的引用,所以我们通过git pull 实现了文件的拉取(增删改),但是没有通过pod update 来更新pod.xcworkspace的文件引用(增删),所以就会找不到编译报错
- 如何减少子工程中增删文件,其他人必须pod update 才能顺利编译造成的时间开销?
- 由于我们只是改了本地的私有podSepc引用,其他的pods依赖依然没有发生变化,也就是说我们没有必要再进行
分析依赖,下载依赖,步骤,如果我们可以直接generate_pods_projec重新建立文件引用,就好了;更或者只是增加文件install_file_reference这一步就好 - 我们可以通过读 CocoaPods/Xcodeproj中的源码,进行仿写修改来看看能不能实现以上功能。
- 由于我们只是改了本地的私有podSepc引用,其他的pods依赖依然没有发生变化,也就是说我们没有必要再进行
- 为什么我们在子工程中增加删除文件,其他人必须pod update 一下,才能顺利编译?
CocoaPods 原理分享及遇到的问题改进的更多相关文章
- 探索HashMap实现原理及其在jdk8数据结构的改进
因为网上已经太多的关于HashMap的相关文章了,为了避免大量重复,又由于网上关于java8的HashMap的相关文章比较少,至少我没有找到比较详细的.所以才有了本文. 本文主要的内容: 1.Hash ...
- Socket 核心原理分享
Socket 的个人故事.希望通过这篇文章让你弄懂什么是 Socket,明白 TCP 和 UDP 协议的通讯,明白长连接和短连接的优缺点,明白 BIO.NIO.AIO的区别. Socket 大家好,我 ...
- 重构 MVC; 代码分享工具(重构,改进,打分)
include 模块和 extend 模块的不同: Class Extension: 通过向singleton class中加入Module来定义class method,是对象扩展的一个特例. ...
- html5设计原理(转)
转自: http://www.cn-cuckoo.com/2010/10/21/the-design-of-html5-2151.html 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一 ...
- 学习HTML5必读之《HTML5设计原理》
引子:很久前看过的一遍受益匪浅的文章,今天再次转过来,希望对学习HTML5的朋友有所帮助. 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一方面,当然了,就是HTML5.我可以站在这儿只讲HT ...
- [转载] 分享D瓜哥最近攒的资料(架构方面)
原文: http://www.diguage.com/archives/41.html 扯扯蛋 以前见过零零散散地介绍一些知名网站架构的分析文章.最近D瓜哥也想研究一下各大知名网站的架构.所以,就搜集 ...
- Xcode7安装CocoaPods
一.CocoaPods介绍以及优点 CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具.该项目源代码在Github上管理. 通过 CocoaPods,能够非常方便的 ...
- IBM中国研究院、SAP、网易游戏、IBM2015应届生招聘笔试面试问题分享
IBM中国研究院实习生 早在今年4月份.我面试的是IBM中国研究院的实习生岗位.主要是自然语言处理和语义网方向.那时我还在香港上学,两个考官对我进行的是电话面试,大概持续半个多小时,首先是我的自我介绍 ...
- iOS组件化开发-CocoaPods简介
CocoaPods简介 任何一门开发语言到达一定阶段就会出现第三方的类库管理工具,比如Java的Maven.WEB的Webpack等.在iOS中类库的管理工具-CocoaPods. 利用CocoaPo ...
随机推荐
- php 文件上传 以及保存在本地的乱码问题处理
要知道两点: ①浏览器传到PHP程序中是UTF-8编码 ②PHP程序保存上传的文件,要转换成GBK编码才保存在本地中,否则如果直接使用浏览器传过来的文件名保存在本地,会出现文件名乱码. <?ph ...
- 设计模式之策略模式Strategy
/** * 策略设计模式 * 策略模式:定义一系列的算法族,使他们之间可以相互转换,动态的改变其行为. * 问题:设计一个鸭子模拟游戏. * 现在有一群鸭子: * ①这些鸭可以有飞的行为(分为快和慢) ...
- Linux下实现定时器Timer的几种方法
http://blog.csdn.net/lxmky/article/details/7669296 第六章 IO复用:select和poll函数 http://www.cnblogs.com/4ti ...
- USACO3.44Raucous Rockers
USACO挂了一小时..我坚持不懈的等..终于打开了 把3章最后一题交了 可以安心的睡去了 之前题意没看清楚 不知道要有序 写了一状压 结果TLE了 再优化也TLE 后来想写状态转移时发现 它必须有 ...
- 通过Microsoft Azure服务设计网络架构的经验分享
作者 王枫 发布于 2014年4月8日 本文从产品设计和架构角度分享了Microsoft Azure网络服务方面的使用经验,希望你在阅读本文之后能够了解这些服务之间,从而更好地设计你的架构. Mic ...
- ARC模式下的单例写法
// 单例 + (id)sharedInstance { __strong static id sharedObject = nil; static dispatch_once_t onceToken ...
- Makefile第四讲:include 引用其它makefile文件
main.cpp #include "classes/fun.h" int main() { Test::display("Hello makefile"); ...
- leecode 回文字符串加强版
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- JVM 字节码执行实例分析
前言 最近在看<Java 虚拟机规范>和<深入理解JVM虚拟机>,对于字节码的执行有了进一步的了解.字节码就像是汇编语言,是 JVM 的指令集.下面我们先对 JVM 执行引擎做 ...
- Yii PHP 框架分析(三)
作者:wdy http://hi.baidu.com/delphiss/blog/item/357663d152c0aa85a1ec9c44.html Yii应用的入口脚本引用出了Yii类,Yii类的 ...