cocoapods 原理分享及问题阐述

  1. cocoapods 管理私有工程,需要两个git 仓库,

    • repo 仓库,保存podspec 文件,告诉我们项目从哪来,
    • 项目 仓库,保存工程文件,告诉我们引用的项目是什么
  2. CocoaPods是用ruby写的,并由若干个ruby包(gems)构成。在解析整合的过程中,最终要的几个gems分别是:
    • CocoaPods/CocoaPods、

      • 这是一个面向用户的组件,每当执行一个pod命令时,这个组件都将被激活。该组件包括了所有使用CocoaPods涉及到的功能,并且还能通过调用左右其他的gems来执行任务。
    • CocoaPods/Core
      • Core组件提供支持与CocoaPods相关文件的处理,文件主要是Podfile和podspecs。

        • podfile 用于定义项目中所需要使用的第三方库。
        • podspec 描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework、编译选项和某个库所需要的依赖等
    • CocoaPods/Xcodeproj。
      • 这个gem组件负责所有工程文件的整合。它能够对创建修改xcodeproj 和 .xworkspace 文件。它也可以作为一个单独的gem包使用。如果你想要写一个脚本来方便的修改工程文件,那么可以使用这个gem。
  3. 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
  4. 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
    • 具体的时间消耗如下所示:
  5. 使用过程中遇到的问题:
    • 为什么我们在子工程中增加删除文件,其他人必须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中的源码,进行仿写修改来看看能不能实现以上功能。

CocoaPods 原理分享及遇到的问题改进的更多相关文章

  1. 探索HashMap实现原理及其在jdk8数据结构的改进

    因为网上已经太多的关于HashMap的相关文章了,为了避免大量重复,又由于网上关于java8的HashMap的相关文章比较少,至少我没有找到比较详细的.所以才有了本文. 本文主要的内容: 1.Hash ...

  2. Socket 核心原理分享

    Socket 的个人故事.希望通过这篇文章让你弄懂什么是 Socket,明白 TCP 和 UDP 协议的通讯,明白长连接和短连接的优缺点,明白 BIO.NIO.AIO的区别. Socket 大家好,我 ...

  3. 重构 MVC; 代码分享工具(重构,改进,打分)

    include 模块和 extend 模块的不同:   Class Extension: 通过向singleton class中加入Module来定义class method,是对象扩展的一个特例. ...

  4. html5设计原理(转)

    转自:   http://www.cn-cuckoo.com/2010/10/21/the-design-of-html5-2151.html 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一 ...

  5. 学习HTML5必读之《HTML5设计原理》

    引子:很久前看过的一遍受益匪浅的文章,今天再次转过来,希望对学习HTML5的朋友有所帮助. 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一方面,当然了,就是HTML5.我可以站在这儿只讲HT ...

  6. [转载] 分享D瓜哥最近攒的资料(架构方面)

    原文: http://www.diguage.com/archives/41.html 扯扯蛋 以前见过零零散散地介绍一些知名网站架构的分析文章.最近D瓜哥也想研究一下各大知名网站的架构.所以,就搜集 ...

  7. Xcode7安装CocoaPods

    一.CocoaPods介绍以及优点 CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具.该项目源代码在Github上管理. 通过 CocoaPods,能够非常方便的 ...

  8. IBM中国研究院、SAP、网易游戏、IBM2015应届生招聘笔试面试问题分享

    IBM中国研究院实习生 早在今年4月份.我面试的是IBM中国研究院的实习生岗位.主要是自然语言处理和语义网方向.那时我还在香港上学,两个考官对我进行的是电话面试,大概持续半个多小时,首先是我的自我介绍 ...

  9. iOS组件化开发-CocoaPods简介

    CocoaPods简介 任何一门开发语言到达一定阶段就会出现第三方的类库管理工具,比如Java的Maven.WEB的Webpack等.在iOS中类库的管理工具-CocoaPods. 利用CocoaPo ...

随机推荐

  1. SPRING IN ACTION 第4版笔记-第二章-002-@ComponentScan、@Autowired的用法

    一.@ComponentScan 1. @Configuration //说明此类是配置文件 @ComponentScan //开启扫描,会扫描当前类的包及其子包 public class CDPla ...

  2. 杂烩:QWidget、QGraphics、QtQuick

    一说起Qt 大都会想起Qt的GUI编程,具体到某个类的话,最多的就是QWidget类及其子类了. 其实Qt中还有基于项的图形视图,具体来说QGraphicsView,QGraphicsScene,QG ...

  3. php Laravel 框架 介绍及安装

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  4. warning: push.default is unset;

    git push warning questions This warning was introduced in Git 1.7.11 along with the simple style of ...

  5. oracle查询转换_inlist转换

    oracle的optimizer会对一些sql语句进行查询转换,比如: 合并视图 子查询非嵌套化 inlist转换 下面讲讲遇到的in list转化优化的案例: create table test( ...

  6. sharepoint 2010 列表数据分页控件介绍 pagination UserControl

    转:http://blog.csdn.net/chenxinxian/article/details/8714391 这里主要是介绍下最近开发的一个sharepoint列表或者文档库的分页控件,并且把 ...

  7. 畅通工程 HDOJ--1863

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. Selenium WebDriver + Grid2 + RSpec之旅(五)---面向对象设计用例

    Selenium WebDriver + Grid2 + RSpec之旅(五) ----面向对象设计用例 前几节讲了怎么一步一步的从零开始到编写出一个简单的测试用例,这一节将要讲一下怎么让测试用例变得 ...

  9. rails第一次做项目

    最近这几天一直都是在做rails的入门,也就是熟悉rails的增.删.改.查操作,做到rails的入门.这几天的熟悉,只是对于操作的熟悉,对于rails语言的机制还有很多不是很熟悉.昨天接手第一个真正 ...

  10. Unity优化之纹理集

    发现了一个比较好用的插件:ProDrawCallOptimizer. 它是用来合并纹理和材质的,而且用起来非常简便. 操作方法: 1.将包拖入Unity5中:ps:由于版本问题,直接双击包时导入不了 ...