@qidiandasheng
2021-04-22T07:42:27.000000Z
字数 3805
阅读 3278
使用工具
Web服务
为什么要做pod仓库镜像,因为当我们在pod update
的时候有时候会特别慢。
这里速度慢主要是因为两件事:
cocoapods
更新spec仓库
这个spec仓库会有几十万个文件(.spec.json)。所以更新这个spec会比较慢,特别是第一次下载这个spec仓库,我第一次下载的时候使用了翻墙稍微快一点也要一两个小时。
解决这步可以脚本定时更新spec仓库,创建定时任务参考:Mac创建定时任务,翻墙参考:Mac全局代理。
下载对应的pod仓库
一般我们依赖的pod仓库都是来源于github,国内访问github也是比较慢的。
解决思路:
所以为了提高效率,我们可以把我们依赖的所有第三方仓库镜像一份到自己的服务器。然后重新弄一份spec仓库,里面只包含我们依赖的pod的.spec文件,把这些spec文件里面source的指向替换为我们对应镜像库的地址。
如果我们手动的去镜像每一仓库的话会特别麻烦,每一次加一个第三方库的时候又要去处理一遍。所以我这里弄了两个方案,一个是搭建一个web服务,一个是使用脚本,用于方便的镜像和定时更新镜像。
当然web服务其实也是基于脚本的,只是给一些命令以及添加所要镜像的pod做了一个界面化操作,更加直观方便。
首先搭建一个Web服务,我这里使用的是Python的Turbogears。具体的安装使用查看Web服务Turbogears的使用。
Http 网站服务使用Apache。
进入虚拟环境
. tgenv/bin/activate
创建项目
cd tgenv
-> gearbox quickstart podMirror
安装依赖关系
cd podMirror
-> Python setup.py develop
初始化服务
gearbox setup-app
到podMirror github下载Web服务的源码。
复制podMirror
目录到上面创建的项目中,直接替换即可。
podMirror目录如下所示:
clone你新建的存放.podspec文件的spec仓库,这里的.podspec
都是修改过指向地址的文件。指向地址为镜像库的仓库地址。
我这里是coding上建的一个仓库:
https://coding.net/u/dasheng/p/smallSpec/git
。
cd podmirror/script
->git clone git@git.coding.net:dasheng/smallSpec.git smallSpec
这里使用ssh来进行操作,关于ssh免密操作如何设置自己去查。然后我们就能看到创建了一个
smallSpec
的仓库,这个就是用于之后存放.podspec
文件的。
修改文件
修改script/podspecSearch.py
里的orgin_dir
路径为你cocoapods
官方spec仓库的路径。如我这里为orgin_dir = "/Users/dasheng/.cocoapods/repos/master/Specs"
。
还是podMirror github里下载前端部分的源码,目录为Documents
。
直接替换Apache Web页面的目录/Library/WebServer/Documents
即可。
进入虚拟环境
. tgenv/bin/activate
启动Web服务
cd /Users/dasheng/tgenv/podMirror/
-> gearbox serve
另外开个终端窗口启动Apache服务
sudo apachectl start
进入web页面
浏览器输入http://127.0.0.1/
这是添加时一些需要填写的参数
podName
:第三方仓库的pod名
sourceHttpUrl
:原第三方库源码httpUrl地址
specSourceHttpUrl
:原第三方库spec文件里source指向的源码httpUrl地址
mirrorSSHUrl
:镜像仓库的SSH地址
mirrorHttpUrl
:镜像仓库的http地址这里的镜像仓库需要直接提前创建好,如我先在
coding
上创建了一个名为SDWebImage
的空仓库。则上面的mirrorSSHUrl
和mirrorHttpUrl
就使用这个仓库的地址。
无需镜像
有一种情况是某个第三方库的spec指向的并不是github的仓库,如友盟,指向的直接是国内的一个.zip文件,那么就不需要镜像,只要复制一个spec文件就可以了。如下图:
列表页面
以下是整个镜像web的主页面。
更新全部镜像
:有时第三方库更新了,那么你这个镜像库也需要更新,点击这个就会更新所有的镜像
定时镜像
:点击这个的话web服务会每1小时执行一下镜像的更新。(在api/start_schedule.py
里修改这个默认时间)
我们按照如上操作在终端里执行命令,但是一旦我们关闭终端,那么这个服务就会停止了,所以这里需要把web服务
变成守护进程,那么即使关闭终端,这个服务还是在运行的。具体如何启动守护进程参考:启动守护进程
这里简单的演示一遍:
//创建一个session
$ screen
按space或enter
//进入虚拟环境
$ . tgenv/bin/activate
//进入python服务目录
$ cd /Users/dasheng/tgenv/podMirror/
//启动web服务
$ gearbox serve
最后关闭终端,你会发现你的web服务还在运行。
当然创建web服务配置是比较麻烦的,所以这里还有一种脚本的方式可以使用。
还是到podMirror github下载源码。
其中mirrorScript
就是脚本目录。可以把它复制到任意目录,比如我这里放到桌面。
首先clone你将要存放.spec文件的仓库,比如我这里是git@git.coding.net:dasheng/smallSpec.git
$ cd Desktop/mirrorScript
$ git clone git@git.coding.net:dasheng/smallSpec.git smallSpec
clone后目录结构如下所示:
这里我们读取podInfo.json里的数据,然后执行脚本。
{
"data":[{"podName":"SDWebImage",
"sourceHttpUrl":"https://github.com/rs/SDWebImage",
"specSourceHttpUrl":"https://github.com/rs/SDWebImage",
"mirrorSSHUrl":"git@git.coding.net:dasheng/SDWebImage.git",
"mirrorHttpUrl":"https://git.coding.net/dasheng/SDWebImage.git",
"noReplaceSource":0}]
}
json格式如上所示,里面的字段我们在上面都提到过,这里还有一个noReplaceSource
就是表示是否替换spec文件里的source,1则为不镜像不替换source,只复制podspec,如友盟。基本上的第三方库都是0。
注意:如果执行脚本时出现ValueError: No JSON object could be decoded
这样的错误,可能就是Json的格式不对,请仔细检查。
修改mirrorScript/podspecSearch.py
里的orgin_dir
路径为你cocoapods
官方spec仓库的路径。如我这里为orgin_dir = "/Users/dasheng/.cocoapods/repos/master/Specs"
。
$ python mirror.py
当然我们肯定是希望脚本是定时运行来更新镜像的,所以我们可以创建定时任务来运行脚本。Mac创建定时任务。
定时任务执行的是shell脚本,所以我们可以简单的创建一个autoMirror.sh
,而这个shell就执行python脚本,autoMirror.sh
内容如下:
#!/bin/bash
#
# vim: sts=4 sw=4 et ai si
/usr/bin/python /Users/dasheng/Desktop/mirrorScript/mirror.py
我们脚本里复制的podspec是来自于cocoapods的官方spec仓库,所以我们要保证这个官方的spec仓库也是最新的,所以可以创建一个定时任务定时更新这个官方spec仓库。如我创建了一个cocoapodsUpdate.sh
,内容如下:
#!/bin/bash
#
# vim: sts=4 sw=4 et ai si
set -o xtrace
PROG=${BASH_SOURCE[0]:-$0}
cd "/Users/dasheng/.cocoapods/repos/master/"
git pull
这里的源码只是一个很粗糙的版本,本人对于Python Web服务和前端不算熟悉。所以还有很多待改进的地方,配置使用暂时有点复杂,还有错误提示,容错等很多都还没做。
这篇文章最主要的只是提供一个思路,欢迎交流讨论。
数据库的表暂时是手动创建的
点击定时镜像时会阻塞进程