iOS开源二进制使用插件 - 使用教程

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端口)

二进制私有源参考:https://github.com/su350380433/example_spec_bin_dev.git(自定义)

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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342