CocoaPods 原理分享及遇到的问题改进
2016-09-26 22:44
183 查看
cocoapods 原理分享及问题阐述
cocoapods 管理私有工程,需要两个git 仓库,repo 仓库,保存podspec 文件,告诉我们项目从哪来,
项目 仓库,保存工程文件,告诉我们引用的项目是什么
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。
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
具体的时间消耗如下所示:
使用过程中遇到的问题:
为什么我们在子工程中增加删除文件,其他人必须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中的源码,进行仿写修改来看看能不能实现以上功能。
相关文章推荐
- 我在开发AJAX过程中遇到的问题及解决方案,分享给大家~
- 小问题,对递归重复调用的改进,一起来分享
- 今天在写程序中遇到的问题与大家分享一下
- Android: 用twitter4j做twitter分享的时候遇到的问题
- 一些工作中遇到的问题分享
- 小问题,对递归重复调用的改进,一起来分享
- CentOS 6搭建LAMP和phpRedisAdmin遇到的问题及解决方法分享
- ASP.NET页面借助IFrame提交表单数据所遇到问题的解决方法分享
- ASP.NET中生成Excel遇到的问题及改进
- 分享下遇到的无线路由显示“已连接”但上不了网的问题
- 使用LINQ遇到的问题,请高手解答下原理
- 把遇到过的对.Net线程的一些问题和误解集中起来和大家分享转载
- 把遇到过的对.Net线程的一些问题和误解集中起来和大家分享
- 把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论
- java中用到args[0]和args[1]做参数时遇到的小问题,和大家分享。
- 把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论(引)
- 最近在学Java,想想后面会遇到很多问题,写个博客分享一下
- 第一个项目进行时 -- 分享遇到的问题
- Android: 用twitter4j做twitter分享的时候遇到的问题
- 分享下 写shell脚本遇到的问题 和解决办法