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 ...
随机推荐
- Android ViewDragHelper源码解析
在自定义ViewGroup的过程中,如果涉及到View的拖动滑动,ViewDragHelper的使用应该是少不了的,它提供了一系列用于用户拖动子View的辅助方法和相关的状态记录,像Navigatio ...
- Jsoup 解析 HTML
Jsoup 文档 方法 要取得一个属性的值,可以使用Node.attr(String key) 方法 对于一个元素中的文本,可以使用Element.text()方法 对于要取得元素或属性中的HTML内 ...
- 转载:MyEclipse中防止代码格式化时出现换行的情况的设置
转载出处:http://www.cnblogs.com/yjhrem/articles/2310013.html 编辑完成代码,用MyEclipse的代码格式化后,本来不长的代码也被自动转成了多行. ...
- BZOJ_1003_[ZJOI2006]_物流运输_(动态规划+最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 m个码头,从1运货到m,n天每天运,其中有一些码头在特定的天里不能使用.运货的代价:在两 ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- 详解Makefile 函数的语法与使用
使用函数: 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多,不过已经足够我们的操作了.函数调用后,函数的返回值可以当做变量来使 ...
- Linux内核学习笔记1——系统调用原理【转】
1什么是系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口.用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文 ...
- lecode Interleaving String
这个问题,前面思考过,当时就是用搜索的方法,此处又遇到一次,发现自己理解的太浅了 Given s1, s2, s3, find whether s3 is formed by the interlea ...
- 深入设计模式(二)——单例模式(Singleton Pattern)
一.单例模式介绍 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它 ...
- Bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 单调栈
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 631 Solved: 445[Submi ...