# cocoapods-imy-bin
**Repository Path**: github-iOS/cocoapods-imy-bin
## Basic Information
- **Project Name**: cocoapods-imy-bin
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-24
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Cocoapods-imy-bin
关于 插件具体的架构部署实践和更详细的资源,可以参考
> [iOS编译速度如何稳定提高10倍以上](https://juejin.im/post/5eccceb9f265da76f30e4e13)
>
> [iOS美团同款"ZSource"二进制调试实现](https://juejin.im/post/5f066cfa5188252e893a136e)
>
> [iOS教你如何像RN一样实时编译](https://juejin.im/post/6850037272415813645)
>
> [Demo](https://github.com/su350380433/cocoapods-imy-bin-demo)
### 特色:
1. **无入侵、无感知、不影响现有业务,不影响现有代码框架、完全绿色产品~**
2. **轻量级,只要项目能编译通过就能使用,无视组件化、无视耦合**
3. **完全自动化,一键使用、无需手动操作**
4. **一步步教你使用,新手也能欢乐玩转**
5. **提供几个特色服务**
6. **近期会推出支持swift项目编译优化的版本,敬请期待**
## 一、概要
cocoapods-imy-bin功能点:
1. 组件二进制化,`无入侵式`支持组件二进制化,完全自动化,无需手动操作。致力于解决Ci打包速度慢、研发编译慢等编译问题。
2. 本地配置文件 - `Podfile_local`
3. 二进制源码调试`pod bin code`,类似[美团 iOS 工程 zsource 命令背后的那些事儿](https://links.jianshu.com/go?to=https%3A%2F%2Ftech.meituan.com%2F2019%2F08%2F08%2Fthe-things-behind-the-ios-project-zsource-command.html)的效果。
4. 命令快捷键`pod bin imy`,如游戏快捷键,根据配置会在特定目录执行特定命令(如任意终端目录下,执行某个特定目录的pod update --no-repo-update命令),减少其他繁琐操作。支持任意个快捷键。
cocoapods-imy-bin插件所关联的组件二进制化策略:
预先将打包成 `.a` 的组件保存到静态服务器上,并在 `install` 时,去下载组件对应的二进制版本,以减少组件编译时间,达到加快 App 打包、组件发布等操作的目的。
## 二、准备工作
### 1、安装插件
```shell
sudo gem install cocoapods-imy-bin
```
## 三、使用二进制组件
### 1、环境搭建
[环境搭建详细教程](https://github.com/su350380433/cocoapods-imy-bin-demo)
使用二进制时,本插件需要提供以下资源:
- 静态资源服务器( [binary-server](https://github.com/su350380433/binary-server),附详细使用教程)
- 二进制私有源仓库(保存组件二进制版本 podspec)
### 2、初始化插件
``` shell
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` 为相应组件的值。
`cococapods-imy-bin` 也支持从 url 下载配置文件,方便对多台机器进行配置:
```shell
➜ ~ pod bin init --bin-url=https://github.com/su350380433/cocoapods-imy-bin-configs/raw/master/bin_dev.yml
```
配置文件模版内容如下,根据不同团队的需求定制即可:
```shell
---
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`服务,静态资源服务。
## 四、制作二进制组件
[视频演示](https://github.com/MeetYouDevs/cocoapods-imy-bin/tree/master/%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%91)
### 1、制作命令
可以直接使用插件的 `pod bin auto`命令,在插件初始化配置完成后,目录下只要有包含podspec文件,根据podspec文件的version版本号会自动化执行build、组装二进制组件、制作二进制podspec、上传二进制文件、上传二进制podspec到私有源仓库。
```shell
pod bin auto
```
带上`—all-make`参数会把当前组件所依赖的组件都自动化制作成二进制组件。
```shell
pod bin local
```
pod bin local 是配合其他三方编译产物的命令,需要配置编译产物的目录。
`BinArchive.json`是制作二进制的一些配置项,放在项目跟目录下:
``` 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 auto`和`pod bin local`二进制Podspec 会自动生成、上传,无需关心。
### 3、查看结果
二进制存储服务:[http://localhost:8080/frameworks/](http://localhost:8080/frameworks/)(默认本地8080端口)
二进制私有源参考:[https://github.com/su350380433/example_spec_bin_dev](https://github.com/su350380433/example_spec_bin_dev)(自定义)
### 4、使用二进制
[视频演示](https://github.com/MeetYouDevs/cocoapods-imy-bin/tree/master/%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%91)
在Podfile文件中,加入这两行代码,对已经制作二进制的就会生效,自动转换二进制组件依赖。
``` ruby
plugin 'cocoapods-imy-bin'
use_binaries!
```
## 五、扩展功能
### 1、本地配置文件 - Podfile_local
本地组件配置文件 Podfile_local,目前已支持Podfile下的大部分功能,可以把一些本地配置的语句放到Podfile_local。
场景:
1. 不希望把本地采用的源码/二进制配置、本地库传到远程仓库。
2. 避免直接修改Podfile文件,引起更新代码时冲突、或者误提交。
如Podfile本地库的写法:
```ruby
pod YYModel :path => '../' #提交的时候往往要修改回来才提交,操作繁琐
```
用法:
在与Podfile同级目录下,新增一个`Podfile_local`文件
```ruby
#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
```
```ruby
以前的 pod update --no-repo-update 命令加个前缀 `bin` 变成
```
```shell
pod bin update --no-repo-update
```
or
```shell
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、二进制源码调试
[视频演示](https://github.com/MeetYouDevs/cocoapods-imy-bin/tree/master/%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%91)
在项目根目录下,输入命令:
```ruby
pod bin code YYModel
```
`YYModel`为需要源码调试的组件库名称。成功之后像平时一样单步调试,控制台打印变量。让我们同时拥有使用二进制的便利和源码调试的能力。
``` shell
$ pod bin code --help [11:37:50]
Usage:
$ pod bin code [NAME]
通过将二进制对应源码放置在临时目录中,让二进制出现断点时可以跳到对应的源码,方便调试。 在不删除二进制的情况下为某个组件添加源码调试能力,多个组件名称用空格分隔
Options:
--all-clean 删除所有已经下载的源码
--clean 删除所有指定下载的源码
--list 展示所有一级下载的源码以及其大小
--source 源码路径,本地路径,会去自动链接本地源码
```
效果与演示参考[链接1](https://juejin.im/post/5eccceb9f265da76f30e4e13#heading-48)、[视频](https://github.com/MeetYouDevs/cocoapods-imy-bin/tree/master/%E6%BC%94%E7%A4%BA%E8%A7%86%E9%A2%91)
### 3、快捷键命令
在任意的终端执行命令,都能执行特定目录下特定命令
使用命令:
```shell
pod bin imy
```
or
``` shell
pod bin imy 2 #2 是自定义的快捷键
```
使用场景:
1. 在任意目录下,执行项目A的pod update --no-repo-update命令
命令快捷键配置
```shell
$ 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'` 语句引入插件
```ruby
plugin 'cocoapods-imy-bin'
```
顺带可以删除 Podfile 中的 source ,因为插件内部会自动帮你添加两个私有源。
`cocoapods-bin `插件提供二进制相关的配置语句有 `use_binaries!`、`use_binaries_with_spec_selector!` 以及 `set_use_source_pods`,下面会分别介绍。
##### use_binaries!
全部组件使用二进制版本。
支持传入布尔值控制是否使用二进制版本,比如 DEBUG 包使用二进制版本,正式包使用源码版本,Podfile 关联语句可以这样写:
```ruby
use_binaries! (ENV['DEBUG'].nil? || ENV['DEBUG'] == 'true')
```
##### set_use_source_pods
设置使用源码版本的组件。
实际开发中,可能需要查看 YYModel 组件的源码,这时候可以这么设置:
```ruby
set_use_source_pods ['YYModel']
```
如果 CocoaPods 版本为 1.5.3 ,终端会输出以下内容,表示 YYModel 的参照源从二进制私有源切换到了源码私有源:
```ruby
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 中添加以下代码:
```ruby
use_binaries_with_spec_selector! do |spec|
spec.name == 'YYModel'
end
```
**需要注意的是,如果组件有 subspec ,使用组件名作为判断条件应如下**:
```ruby
use_binaries_with_spec_selector! do |spec|
spec.name.start_with? == '组件名'
end
```
如果像上个代码块一样,**直接对比组件名,则插件会忽略此组件的所有 subspec,导致资源拉取错误**,这种场景下,最好通过 `set_use_source_pods` 语句配置依赖。
一个实际应用是,三方组件采用二进制版本,团队编写的组件依旧采用源码版本。如果三方组件都在 `cocoapods-repo` 组下,就可以使用以下代码过滤出三方组件:
```ruby
use_binaries_with_spec_selector! do |spec|
git = spec.source && spec.source['git']
git && git.include?('cocoapods-repo')
end
```
##### 切换Dev/Debug_iPhoneos/Release_iPhoneos环境初始化设置
```shell
#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指定设置
```shell
#在podfile 或者 podfile_local 文件下加这句话
set_configuration_env('debug_iphoneos')
```
##### 其他设置
插件默认开启多线程下载组件资源,如果要禁用这个功能,Podfile 添加以下代码即可:
```ruby
install! 'cocoapods', { install_with_multi_threads: false }
```
## 七、感谢
**[cocoapods-bin](https://github.com/tripleCC/cocoapods-bin)**
[美团 iOS 工程 zsource 命令背后的那些事儿](https://links.jianshu.com/go?to=https%3A%2F%2Ftech.meituan.com%2F2019%2F08%2F08%2Fthe-things-behind-the-ios-project-zsource-command.html)
#### 您有什么更好的想法,可以提出来,我们一起来实现,共创一个强大的工具平台,同时也欢迎给我们提PR。
研发不易,走过路过的点个星星✨,让更多的人来加入我们,让我们一起来交流学习更上一层~