1. 程式人生 > Android開發 >iOS開源二進位制使用外掛cocoapods-imy-bin

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: [email protected]:su350380433/example_spec_source.git
binary_repo_url: [email protected]: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: [email protected]:su350380433/example_spec_source.git
binary_repo_url: [email protected]: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": [
        "[email protected]: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 `[email protected]:ios/cocoapods-spec.git` from `[email protected]: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。