@qidiandasheng
2021-04-22T07:45:34.000000Z
字数 4609
阅读 4659
使用工具
Web服务
之前写了一篇Pod二进制化的文章介绍如何把Pod源码进行二进制化,以及原理还有使用的工具等。我们可以比较容易的生成二进制库,并且也能在二进制和源码之间进行切换。
但是这只是一种理想中的思路,离实际应用还比较远,如果公司里进行推广还是比较难让人接受。虽然只要运行下脚本,然后修改下Podspec就行了,但是这样又无形的增加了成本,为了减少编译时间,增加了打包二进制库的时间。实际的投入产出不一定值得。
这里列出几个实际中的问题,针对这几个问题进行改进。
使Pod开发者无需本地运行脚本,无需手动修改Podspec。
二进制库不跟原有源码混在一个仓库,对原有仓库进行污染。
默认还是运行源码,不影响现有打包,开发等。
解决方案分别为界面化操作
、二进制包和源码分仓库进行管理
、pod install 设置参数选择
简单的说就是搭建一个web服务,让管理者直接在前端页面上添加要二进制化的Pod库,然后直接在页面上可视化操作就行了。这样的话比开发者直接在本地生成使用脚本和修改Podspec时出错率小很多,而且简单方便。
可以指定一个管理者,每段时间去页面上生成一次就可以了,不用再执行clone push等等麻烦的操作。
下面几张图就是我的界面化操作的前端页面:
这是已添加的二进制化的Pod,简单说明一下。每一个Pod包含三种操作:编辑、删除、标签。
编辑
:修改一些对应的参数
删除
:删除这个Pod对应的所有二进制库
标签
:进入标签管理页面,对Pod对应的tag进行二进制化
这是添加时一些需要填写的参数。
podName和repoName
: podName表示你这个Pod的名字,repoName也就是你存放这个Pod源码的仓库名。这两个参数基本上都是一样的,但是偶尔会有某些奇葩的pod这两个名字不一样,所以我两个都填了一下。
podspecName
: 我们的每一个Pod里都会有一个.podspec文件,一般命名都是podName.podspec,但是有的会是podName.podspec.json,所以这里也需要填一下。
sourceSSHUrl
: 源码仓库的SSH地址,主要用于clone源码。
sourceHttpUrl
: .podspec里指向的源码Http地址。
libSSHUrl
: 将要存放二进制库的仓库SSH地址,主要用于clone,push二进制库。
libHttpUrl
: 将要存放二进制库的仓库Http地址,用于把.podspec里的sourceHttpUrl替换为libHttpUrl.
上图中的标签按钮点进来的页面,用于生产对应tag的二进制库
可以生成对应tag的二进制库,和删除旧的没用的tag的二进制库。
新增时有两个参数,为tag和tagBranch。
tag
: pod需要生成二进制库的tag。
tagBranch
:tag对应的Branch的名字,大部分都是相同的,但是有的branch名为v-tagName,所以需要特殊对待。
为了不污染源码,我们应该新建一个仓库用于存放我们的二进制库,也就是我们在上面的界面化操作里面用到的libSSHUrl
和libHttpUrl
。这里存在一个问题:
会有两个.podspec
文件,一个指向源码仓库,一个指向二进制仓库。那么这个新的.podspec
文件放在哪里?
我们新建一个仓库,用来存放二进制库的.podspec文件,然后使用的时候在
Podfile
文件里修改一下source:
$libSpec = ENV['use_lib’]
if $libSpec
source 'https://git.coding.net/dasheng/smallLibSpecs.git'
else
source 'https://github.com/CocoaPods/Specs.git'
end
安装的时候直接
use_lib=1 pod install
,那么使用的source就是smallLibSpec了。如果不加前面那个参数就是使用源码的那个spec仓库了,也就是我们看到的这个官方spec仓库了。实际使用的时候我们会发现一个问题,就是按照上面的做法做的话,如果某个Pod我们没有生成二进制库的话,source选择了
smallLibSpecs
,而里面是没有这个Pod的。我们安装的时候就会报错,提示找不到此pod,我这里的做法是把这个Pod的.podspec
一模一样的复制一份到smallLibSpecs
里。所以我上面界面化操作时有一个按钮是更新无二进制的spec
,也就是把这些无二进制但是用到的Pod库的.podspec文件原封不动的复制一份到smallLibSpecs
里。注:这里的
smallLibSpecs
指我们创建的用于存放二进制库.podspec文件的仓库,我这里是https://git.coding.net/dasheng/smallLibSpecs.git
我们在使用这项技术的时候,肯定不应该对现有的业务开发,打包等有影响,因为你生成的二进制库不一定是可用的,可能会出现错误。而我希望开发者如果没这个需求的话继续按照原有的来,也就是说我上了这个二进制化方案对他们来说是无感的,只有他自己有需求的时候在加入对应参数进行选择即可。
这里主要分为两块代码:
第一块我上面那部分已经提到过了,默认使用源码的source,当需要二进制库时use_lib=1 pod install
:
$libSpec = ENV['use_lib’]
if $libSpec
source 'https://git.coding.net/dasheng/smallLibSpecs.git'
else
source 'https://github.com/CocoaPods/Specs.git'
end
还有一部分是代码每一个Pod里的.podspec文件需要修改的,在use_lib=1 pod install
的时候,Pod默认使用二进制库,但是我们还可以加入一个参数使某个特定的Pod切换为源码,如下面这个为APNumberPad
的.podspec里的一部分。
我们使用的时候就是use_lib=1 APNumberPad_source=1 pod install
,使APNumberPad
切换为源码。
$source = ENV['use_source']
$source_name = ENV["#{s.name}_source"]
if $source || $source_name
s.source_files = 'APNumberPad/APNumberPad/*.{h,m}'
else
s.ios.vendored_framework = "APNumberPad-1.1.3/ios/APNumberPad.embeddedframework/APNumberPad.framework"
end
首先搭建一个Web服务,我这里使用的是Python的Turbogears。具体的安装使用查看Web服务Turbogears的使用。
Http 网站服务使用Apache。
进入虚拟环境
. tgenv/bin/activate
创建项目
cd tgenv
-> gearbox quickstart libCreat
安装依赖关系
cd libCreat
-> Python setup.py develop
初始化服务
gearbox setup-app
到libCreat github下载Web服务的源码。
复制libCreat
目录到上面创建的项目中,直接替换即可。
libCreat目录如下所示:
clone你新建的存放.podspec文件的spec仓库,这里的.podspec
都是修改过指向地址的文件。指向地址为二进制库的仓库地址。
我这里是coding上建的一个仓库:
https://git.coding.net/dasheng/smallLibSpecs.git
。
cd libcreat/script
->git clone git@git.coding.net:dasheng/smallLibSpecs.git smallLibSpecs
这里使用ssh来进行操作,关于ssh免密操作如何设置自己去查。然后我们就能看到创建了一个
smallLibSpecs
的仓库,这个就是用于之后存放.podspec
文件的。
clone源码的spec仓库
我在coding上创建了一个spec仓库,里面都是暂时项目里用到的一些pod的podspec文件,这些pod我都镜像了一份到coding上,所以这些podspec指向的地址就是coding上的地址。我们在spec文件夹里clone这个仓库,当然一般公司不知有一个spec仓库,所以spec里会有多个仓库。这里暂时只演示一个仓库。
cd libcreat/script/spec
->git clone git@git.coding.net:dasheng/smallSpecs.git smallSpecs
修改文件
修改script/updateNoLibScript.py
文件,修改如下图中的那个路径为你上一步在spec里创建的仓库,我这里有两个:smallSpec_dir
和dsSpec_dir
,如我上一步只创建了一个smallSpec_dir
,那dsSpec_dir
这个可以删除。
还有script/creatScript.py
这个文件里的master_dir
路径也可以注意一下,这是我写的脚本的问题,可以改进。
还是libCreat github里下载前端部分的源码,目录为Documents
。
直接替换Apache Web页面的目录/Library/WebServer/Documents
即可。
启动Web服务
cd /Users/dasheng/tgenv/libCreat/
-> gearbox serve
启动Apache服务
sudo apachectl start
进入web页面,点击新增
浏览器输入http://127.0.0.1/
,点击新增。我这里新增了一个APNumberPad
。参数如下:
进入标签页面
然后新增对应的tag即可。
工程应用
创建一个test项目,编写Podfile如下:
$libSpec = ENV['use_lib’]
if $libSpec
source 'https://git.coding.net/dasheng/smallLibSpecs.git'
else
source 'https://github.com/CocoaPods/Specs.git'
end
target 'test' do
pod 'APNumberPad', '1.2.0'
end
use_lib=1 pod install
安装的就是二进制库,pod install
安装的就是源码库。
这里的源码只是一个很粗糙的版本,本人对于Python Web服务和前端不算熟悉。所以还有很多待改进的地方,配置使用暂时有点复杂,还有错误提示,容错等很多都还没做。
这篇文章最主要的只是提供一个思路,欢迎交流讨论。
数据库的两张表暂时是手动创建的
第一次创建tag的二进制库时会显示切换tag失败
编辑Pod信息时,修改pod地址,再去生成二进制库的时候会失败