iOS開源二進位制使用外掛cocoapods-imy-bin
一、概要
cocoapods-imy-bin功能點:
- 元件二進位制化,
無入侵式
支援元件二進位制化,致力於解決Ci打包速度慢、研發編譯慢等編譯問題。 - 本地配置檔案 -
Podfile_local
-
二進位制原始碼除錯
pod bin code,類似美團 iOS 工程 zsource 命令背後的那些事兒的效果。 -
命令快捷鍵
pod bin imy,如遊戲快捷鍵,根據配置會在特定目錄執行特定命令(如任意終端目錄下,執行某個特定目錄的pod update --no-repo-update命令),減少其他繁瑣操作。支援任意個快捷鍵。
cocoapods-imy-bin外掛所關聯的元件二進位制化策略:
預先將打包成 .a
的元件儲存到靜態伺服器上,並在 install
時,去下載元件對應的二進位製版本,以減少元件編譯時間,達到加快 App 打包、元件釋出等操作的目的。
關於 外掛具體的架構部署實踐和更詳細的資源,可以參考
二、準備工作
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 auto
和pod 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檔案,引起更新程式碼時衝突、或者誤提交。
如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 原始碼路徑,本地路徑,會去自動連結本地原始碼
複製程式碼
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 }
複製程式碼