[关闭]
@qidiandasheng 2021-04-21T23:45:34.000000Z 字数 4609 阅读 4423

iOS cocoapods二进制化方案(❎)

使用工具 Web服务


方案思路

之前写了一篇Pod二进制化的文章介绍如何把Pod源码进行二进制化,以及原理还有使用的工具等。我们可以比较容易的生成二进制库,并且也能在二进制和源码之间进行切换。

但是这只是一种理想中的思路,离实际应用还比较远,如果公司里进行推广还是比较难让人接受。虽然只要运行下脚本,然后修改下Podspec就行了,但是这样又无形的增加了成本,为了减少编译时间,增加了打包二进制库的时间。实际的投入产出不一定值得。

这里列出几个实际中的问题,针对这几个问题进行改进。

解决方案分别为界面化操作二进制包和源码分仓库进行管理pod install 设置参数选择

界面化操作

简单的说就是搭建一个web服务,让管理者直接在前端页面上添加要二进制化的Pod库,然后直接在页面上可视化操作就行了。这样的话比开发者直接在本地生成使用脚本和修改Podspec时出错率小很多,而且简单方便。

可以指定一个管理者,每段时间去页面上生成一次就可以了,不用再执行clone push等等麻烦的操作。

下面几张图就是我的界面化操作的前端页面:


二进制包和源码分仓库进行管理

为了不污染源码,我们应该新建一个仓库用于存放我们的二进制库,也就是我们在上面的界面化操作里面用到的libSSHUrllibHttpUrl。这里存在一个问题:

会有两个.podspec文件,一个指向源码仓库,一个指向二进制仓库。那么这个新的.podspec文件放在哪里?

我们新建一个仓库,用来存放二进制库的.podspec文件,然后使用的时候在Podfile文件里修改一下source:

  1. $libSpec = ENV['use_lib’]
  2. if $libSpec
  3. source 'https://git.coding.net/dasheng/smallLibSpecs.git'
  4. else
  5. source 'https://github.com/CocoaPods/Specs.git'
  6. 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


pod install 设置参数选择

我们在使用这项技术的时候,肯定不应该对现有的业务开发,打包等有影响,因为你生成的二进制库不一定是可用的,可能会出现错误。而我希望开发者如果没这个需求的话继续按照原有的来,也就是说我上了这个二进制化方案对他们来说是无感的,只有他自己有需求的时候在加入对应参数进行选择即可。

这里主要分为两块代码:

第一块我上面那部分已经提到过了,默认使用源码的source,当需要二进制库时use_lib=1 pod install

  1. $libSpec = ENV['use_lib’]
  2. if $libSpec
  3. source 'https://git.coding.net/dasheng/smallLibSpecs.git'
  4. else
  5. source 'https://github.com/CocoaPods/Specs.git'
  6. end

还有一部分是代码每一个Pod里的.podspec文件需要修改的,在use_lib=1 pod install的时候,Pod默认使用二进制库,但是我们还可以加入一个参数使某个特定的Pod切换为源码,如下面这个为APNumberPad的.podspec里的一部分。
我们使用的时候就是use_lib=1 APNumberPad_source=1 pod install,使APNumberPad切换为源码。

  1. $source = ENV['use_source']
  2. $source_name = ENV["#{s.name}_source"]
  3. if $source || $source_name
  4. s.source_files = 'APNumberPad/APNumberPad/*.{h,m}'
  5. else
  6. s.ios.vendored_framework = "APNumberPad-1.1.3/ios/APNumberPad.embeddedframework/APNumberPad.framework"
  7. end

配置及实现方案

安装环境

首先搭建一个Web服务,我这里使用的是Python的Turbogears。具体的安装使用查看Web服务Turbogears的使用

Http 网站服务使用Apache。

创建Web服务的项目

使用Python源码

libCreat github下载Web服务的源码。

复制libCreat目录到上面创建的项目中,直接替换即可。

libCreat目录如下所示:

配置Python源码

使用前端源码

还是libCreat github里下载前端部分的源码,目录为Documents
直接替换Apache Web页面的目录/Library/WebServer/Documents即可。


使用


问题及更新

这里的源码只是一个很粗糙的版本,本人对于Python Web服务和前端不算熟悉。所以还有很多待改进的地方,配置使用暂时有点复杂,还有错误提示,容错等很多都还没做。

这篇文章最主要的只是提供一个思路,欢迎交流讨论。

待解决问题

更新

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注