前言
本文重点不在介绍cocoapods各种细枝末节。
本文关注pod install 对branch依赖的加速。
1、简单了解一下Podfile库依赖方式
Podfile库依赖方式有如下几种
1.1、使用本地路径的依赖
如果项目和 Pod 库同时进行开发,则可以使用 path
选项。
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
1.2、使用指定地址的 pod 库-branch
有时可能需要使用最新版本或特别修改过的 Pod。
这种情况下,可以指定 pod 库的地址。
使用依赖库的 master 分支:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
指定使用依赖库的另一个分支:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
1.3、使用指定地址的 pod 库 - tag
方式1:
pod 'AFNetworking',:tag => '0.7.0'
方式2:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
1.4、指定某次提交
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
2、遇到的问题
pod install,会基于git指令进行库的下载操作。
第一次下载远程仓库时,默认clone了git的所有提交记录。
如果一个库长期频繁操作,提交大文件等,会导致.git目录持续膨胀。
不注意的情况下有些库整体clone大小可以膨胀到几个G。
这就带来了问题:
1、当项目过大时,git clone时会出现error: RPC failed; HTTP 504 curl 22 The requested URL returned error: 504 Gateway Time-out的问题,如下图
2、git 下载进度非常慢,如果网络不好还会频繁发生超时失败的情况
3、一个大型工程,第一次install整个工程,甚至可能要等待数小时
3、分析问题
install慢,有个git clone环节比较关键。
git 加速解决方法很简单,在git clone时加上–depth 1即可。
depth用于指定克隆深度,为1即表示只克隆最近一次commit
对于以上列出的几种库依赖,cocoapods在git clone时,除了branch
方式,其它方式都加了–depth 1。
看来瓶颈在branch的支持。
是不是在podfile里对branch的依赖方式加入参数即可控制?
想当然的试了一下:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev' --depth 1
草率了,不生效。
并且破坏了pod的指令规则,pod install流程也被终止了。
尝试找找cocoapods 提供的 hook规范,无解。
似乎僵住了。
4、cocoapods源码
换个思路,看看cocoapods的源码,它是怎么支持branch的。
4.1、cocoapods-downloader
我当前cocoapods版本源码所在目录
/Library/Ruby/Gems/2.6.0/gems/cocoapods-downloader-1.3.0
关键代码文件:
git.rb
不同版本pod可能目录不同,其它版本所在目录与其类似,按需找。
4.2、pod源码未做修改的现状
downloader下载代码时,对于branch模式的支持是这样的:
git clone git@code.amh-group.com:iOSYmm/YMMCommonUILib.git /var/folders/37/hc7qt7ys5w103q0jsqcrdgvm0000gn/T/d20210325-27574-1usb092 --template=
可以看出,没有–depth 1 浅拷贝指令
clone完成后,.git目录大小31.5MB
4.3、修改pod源码
尝试修改git.rb
,对branch的处理加入–depth 1参数
下图圈出的地方注释掉
修改clone_arguments 方法,下图是修改后的代码
def clone_arguments(force_head, shallow_clone)
command = ['clone', url, target_path]
if branch = options[:branch]
command += ['--branch', branch,'--depth',1]
else
command += ['--template=']
if shallow_clone && !options[:commit]
command += %w(--single-branch --depth 1)
end
unless force_head
if tag_or_branch = options[:tag] || options[:branch]
command += ['--branch', tag_or_branch]
end
end
end
command
end
再看看效果。
pod install时,控制台日志:
/usr/bin/git clone git@code.amh-group.com:iOSYmm/YMMCommonUILib.git /var/folders/37/hc7qt7ys5w103q0jsqcrdgvm0000gn/T/d20210325-28146-cpennz --branch develop_20210401
--depth 1
验证下载的代码体积
clone完成后,.git目录大小1.4MB
4.4、验证修改后的git.rb是否影响宿主工程
一切正常。
小结
可以通过实验路径“优化”branch依赖方式。
虽然这个实验初见效果,实际生产也正常,但不能盲目相信它。
源码作者在这里的设计肯定有他的考虑。
可能我们在第三层,以为源码作者在第五层,其实他在第九层。