阅读 1313

iOS开源二进制使用插件cocoapods-imy-bin

iOS编译速度如何稳定提高10倍以上

GitHub开源地址

附详细使用教程

一、概要

cocoapods-imy-bin功能点:

  1. 组件二进制化,无入侵式支持组件二进制化,致力于解决Ci打包速度慢、研发编译慢等编译问题。
  2. 本地配置文件 - Podfile_local
  3. 二进制源码调试pod bin code,类似美团 iOS 工程 zsource 命令背后的那些事儿的效果。
  4. 命令快捷键pod bin imy,如游戏快捷键,根据配置会在特定目录执行特定命令(如任意终端目录下,执行某个特定目录的pod update --no-repo-update命令),减少其他繁琐操作。支持任意个快捷键。

cocoapods-imy-bin插件所关联的组件二进制化策略:

预先将打包成 .a 的组件保存到静态服务器上,并在 install 时,去下载组件对应的二进制版本,以减少组件编译时间,达到加快 App 打包、组件发布等操作的目的。

关于 插件具体的架构部署实践和更详细的资源,可以参考

Demo

二、准备工作

1、安装插件

sudo gem install cocoapods-imy-bin
复制代码

三、使用二进制组件

1、环境搭建

环境搭建详细教程

使用二进制时,本插件需要提供以下资源:

  • 静态资源服务器( binary-server,附详细使用教程)
  • 二进制私有源仓库(保存组件二进制版本 podspec)

2、初始化插件

xx:Demo slj$ pod bin init

======  dev 环境 ========

开始设置二进制化初始信息.
所有的信息都会保存在 /Users/slj/.cocoapods/bin_dev.yml 文件中.
%w[bin_dev.yml bin_debug_iphoneos.yml bin_release_iphoneos.yml] 
你可以在对应目录下手动添加编辑该文件. 文件包含的配置信息样式如下:

---
configuration_env: dev
code_repo_url: git@github.com:su350380433/example_spec_source.git
binary_repo_url: git@github.com:su350380433/example_spec_bin_dev.git
binary_download_url: http://localhost:8080/frameworks/%s/%s.zip
download_file_type: zip


编译环境
可选值:[ dev / debug_iphoneos / release_iphoneos ]
旧值:dev
复制代码

按提示输入所属环境、源码私有源、二进制私有源、二进制下载地址、下载文件类型后,插件就配置完成了。其中 binary_download_url 需要预留组件名称与组件版本占位符,插件内部会依次替换 %s 为相应组件的值。

cococapod-bin 也支持从 url 下载配置文件,方便对多台机器进行配置:

➜  ~ pod bin init --bin-url=https://github.com/su350380433/cocoapods-imy-bin-configs/raw/master/bin_dev.yml
复制代码

配置文件模版内容如下,根据不同团队的需求定制即可:

---
configuration_env: dev
code_repo_url: git@github.com:su350380433/example_spec_source.git
binary_repo_url: git@github.com:su350380433/example_spec_bin_dev.git
binary_download_url: http://localhost:8080/frameworks/%s/%s/zip
download_file_type: zip

复制代码

配置时,不需要手动添加源码和二进制私有源的 repo,插件在找不到对应 repo 时会主动 clone。

记得启动 sudo mongod服务,静态资源服务。

四、制作二进制组件

视频演示

1、制作命令

可以直接使用插件的 pod bin auto命令,在插件初始化配置完成后,目录下只要有包含podspec文件,根据podspec文件的version版本号会自动化执行build、组装二进制组件、制作二进制podspec、上传二进制文件、上传二进制podspec到私有源仓库。

pod bin auto
复制代码

带上—all-make参数会把当前组件所依赖的组件都自动化制作成二进制组件。

pod bin local
复制代码

pod bin local 是配合其他三方编译产物的命令,需要配置编译产物的目录。

BinArchive.json是制作二进制的一些配置项,放在项目跟目录下:

{
    "//": "archive-white-pod-list 不制作二进制白名单,",
    "archive-white-pod-list" : [
        "YYTargetDemo",
        "YYModel"
    ],
    "//": "ignore-git-list 不制作二进制 所属git白名单,",
    "ignore-git-list": [
        "git@gitlab.xxx.com:Github-iOS"
    ],
     "//": "ignore-http-list 不制作二进制 所属https白名单,",
    "ignore-http-list": [
        "https://gitlab.xxx.com/Github-iOS"
    ],
    "//": "xcode_build_path 设置编译缓存完整路径, 默认地址如下",
    "xcode_build_path" : "xcode-build/Build/Intermediates.noindex/ArchiveIntermediates/#{target_name}/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/",
}
复制代码

2. 二进制Podspec

通过pod bin autopod bin local二进制Podspec 会自动生成、上传,无需关心。

3、查看结果

二进制存储服务:http://localhost:8080/frameworks/(默认本地8080端口)

二进制私有源参考:github.com/su350380433…

4、使用二进制

视频演示

在Podfile文件中,加入这两行代码,对已经制作二进制的就会生效,自动转换二进制组件依赖。

plugin 'cocoapods-imy-bin'
use_binaries!
复制代码

五、扩展功能

1、本地配置文件 - Podfile_local

本地组件配置文件 Podfile_local,目前已支持Podfile下的大部分功能,可以把一些本地配置的语句放到Podfile_local。

Podfile_local.png

场景:

  1. 不希望把本地采用的源码/二进制配置、本地库传到远程仓库。
  2. 避免直接修改Podfile文件,引起更新代码时冲突、或者误提交。

如Podfile本地库的写法:

pod YYModel :path => '../' #提交的时候往往要修改回来才提交,操作繁琐
复制代码

用法:

在与Podfile同级目录下,新增一个Podfile_local文件,模板可到这里下载Podfile_local

#target 'Seeyou' do 不同的项目注意修改下Seeyou的值
#:path => '../IMYYQHome',根据实际情况自行修改,与之前在podfile写法一致


 plugin 'cocoapods-imy-bin'
#是否启用二进制插件,想开启把下面注释去掉
# use_binaries! 

#设置使用【源码】版本的组件。
#set_use_source_pods ['YYKit','SDWebImaage']

#需要替换Podfile里面的组件才写到这里
#在这里面的所写的组件库依赖,默认切换为【源码】依赖
target 'Seeyou' do
  #本地库引用
	#pod 'YYModel', :path => '../YYModel'

  #覆盖、自定义组件
  	#pod 'YYCache', :podspec => 'http://覆盖、自定义/'
end
复制代码
以前的 pod update --no-repo-update 命令加个前缀 `bin` 变成
复制代码
pod bin update --no-repo-update 
复制代码

or

pod bin install
复制代码

支持 pod install/update 命令参数

并将其加入 .gitignore ,再也不用担心我误提交或者冲突了,Podfile_local 中的配置选项优先级比 Podfile 高,支持和 Podfile 相同的配置语句,同时支持pre_install or post_install

如果您不习惯Podfile_local的使用方式,可以把命令写在Podfile里面,pod时不需要加bin,依旧是 pod update/install。

2、二进制源码调试

视频演示

在项目根目录下,输入命令:

pod bin code YYModel
复制代码

YYModel为需要源码调试的组件库名称。成功之后像平时一样单步调试,控制台打印变量。让我们同时拥有使用二进制的便利和源码调试的能力。

 $ pod bin code --help                                                                   [11:37:50]
Usage:

    $ pod bin code [NAME]

      通过将二进制对应源码放置在临时目录中,让二进制出现断点时可以跳到对应的源码,方便调试。 在不删除二进制的情况下为某个组件添加源码调试能力,多个组件名称用空格分隔

Options:

    --all-clean   删除所有已经下载的源码
    --clean       删除所有指定下载的源码
    --list        展示所有一级下载的源码以及其大小
    --source      源码路径,本地路径,会去自动链接本地源码
复制代码

效果与演示参考链接1视频

3、快捷键命令

在任意的终端执行命令,都能执行特定目录下特定命令

使用命令:

pod bin imy
复制代码

or

pod bin imy 2    #2 是自定义的快捷键
复制代码

使用场景:

1. 在任意目录下,执行项目A的pod update --no-repo-update命令
复制代码

命令快捷键配置

 $ pod bin inithk                                                                        [11:37:58]

开始设置快捷键 pod bin imy.
所有的信息都会保存在 /Users/ci/.cocoapods/hot_key_1.yml 文件中.
%w[hot_key.yaml] 
你可以在对应目录下手动添加编辑该文件. 文件包含的配置信息样式如下:

---
hot_key_index: '1'
hot_key_dir: '/User/ci/自定义目录'
hot_key_cmd: pod bin update --no-repo-update


快捷键
可选值:[ 1 / 2 / 3... ]
旧值:1 
复制代码

六、 DSL参数解释

首先,开发者需要在 Podfile 中需要使用 plugin 'cocoapods-imy-bin' 语句引入插件

plugin 'cocoapods-imy-bin'
复制代码

顺带可以删除 Podfile 中的 source ,因为插件内部会自动帮你添加两个私有源。

cocoapods-bin插件提供二进制相关的配置语句有 use_binaries!use_binaries_with_spec_selector! 以及 set_use_source_pods,下面会分别介绍。

use_binaries!

全部组件使用二进制版本。

支持传入布尔值控制是否使用二进制版本,比如 DEBUG 包使用二进制版本,正式包使用源码版本,Podfile 关联语句可以这样写:

use_binaries! (ENV['DEBUG'].nil? || ENV['DEBUG'] == 'true')
复制代码
set_use_source_pods

设置使用源码版本的组件。

实际开发中,可能需要查看 YYModel 组件的源码,这时候可以这么设置:

set_use_source_pods ['YYModel']
复制代码

如果 CocoaPods 版本为 1.5.3 ,终端会输出以下内容,表示 YYModel 的参照源从二进制私有源切换到了源码私有源:

Analyzing dependencies
Fetching podspec for `A` from `../`
Downloading dependencies
Using A (0.1.0)
Installing YYModel 1.0.4.2 (source changed to `git@git.xxxxxx.net:ios/cocoapods-spec.git` from `git@git.xxxxxx.net:ios/cocoapods-spec-binary.git`)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 2 total pods installed.
复制代码
use_binaries_with_spec_selector!

过滤出需要使用二进制版本组件。

假如开发者只需要 YYModel 的二进制版本,那么他可以在 Podfile 中添加以下代码:

use_binaries_with_spec_selector! do |spec|
  spec.name == 'YYModel'
end
复制代码

需要注意的是,如果组件有 subspec ,使用组件名作为判断条件应如下

use_binaries_with_spec_selector! do |spec|
  spec.name.start_with? == '组件名'
end
复制代码

如果像上个代码块一样,直接对比组件名,则插件会忽略此组件的所有 subspec,导致资源拉取错误,这种场景下,最好通过 set_use_source_pods 语句配置依赖。

一个实际应用是,三方组件采用二进制版本,团队编写的组件依旧采用源码版本。如果三方组件都在 cocoapods-repo 组下,就可以使用以下代码过滤出三方组件:

use_binaries_with_spec_selector! do |spec|
 git = spec.source && spec.source['git']
 git && git.include?('cocoapods-repo')
end
复制代码
切换Dev/Debug_iPhoneos/Release_iPhoneos环境初始化设置
#dev 初始化插件配置 默认dev环境
pod bin init --bin-url=https://gitlab.xxx.com/cocoapods-imy-bin-config/raw/master/bin_dev.yml

#Debug_iPhoneos 初始化插件配置
pod bin init --bin-url=https://gitlab.xxx.com/cocoapods-imy-bin-config/raw/master/bin_debug_iphoneos.yml


#release_iPhoneos 初始化插件配置
pod bin init --bin-url=https://gitlab.xxx.com/cocoapods-imy-bin-config/raw/master/bin_release_iphoneos.yml
复制代码

使用时在podfile 或者 podfile_local指定设置

#在podfile 或者 podfile_local 文件下加这句话
set_configuration_env('debug_iphoneos')	
复制代码
其他设置

插件默认开启多线程下载组件资源,如果要禁用这个功能,Podfile 添加以下代码即可:

install! 'cocoapods', { install_with_multi_threads: false }
复制代码

七、感谢

cocoapods-bin

美团 iOS 工程 zsource 命令背后的那些事儿

您有什么更好的想法,可以提出来,我们一起来实现,共创一个强大的平台,同时也欢迎给我们提PR。