【Toki組件化】包含靜態(tài)包的Pod庫

序言

經(jīng)過長時間的使用實(shí)踐拜轨,發(fā)現(xiàn)靜態(tài)包使用率不高,所以這個解決方案現(xiàn)已棄用胯甩。

介紹

考慮到代碼編譯時間,我在構(gòu)建組件化過程中引入了靜態(tài)包方案木柬,即每一個Pod庫都支持源碼和靜態(tài)包兩種安裝方式。
這不但需要修改*.podspec文件來支持恶复,還須要在每次發(fā)布前編譯靜態(tài)包谤牡。

開發(fā)過程變得比較繁瑣姥宝,為了方便開發(fā)腊满,我對官方模版做了一點(diǎn)優(yōu)化培己,發(fā)布了Pod-Template省咨,還寫了一個命令行工具 Pod-Pipeline 來簡化發(fā)布操作零蓉。

Pod-Template介紹

  1. 結(jié)構(gòu)改動
  • 由于我暫時沒有進(jìn)行swift為主的Pod庫開發(fā)敌蜂。所以我刪掉了模版中的swift內(nèi)容绅项。
  • 由于我希望Pod庫支持靜態(tài)包。所以我移除了Podfile中的use_frameworks!
  • 由于Pod內(nèi)容和編譯內(nèi)容較多囊陡,且不是必要保存內(nèi)容撞反。所以在.gitignore文件中添加了Pods/${POD_NAME}-*/兩個默認(rèn)忽略項(xiàng)遏片。
  • 由于靜態(tài)包的二進(jìn)制文件無法被Git識別內(nèi)容變化吮便,每次都直接上傳的話會讓Git倉庫變得很大。所以我引入了Git LFS(Large File Storage)髓需,并在項(xiàng)目中添加了.gitattributes 文件僚匆。但是須要使用者自己在設(shè)備中安裝Git LFS搭幻,并在項(xiàng)目中執(zhí)行git lfs install檀蹋。
  1. 通用Pod庫的*.podspec中關(guān)于資源、代碼引用的改動

我們在執(zhí)行pod install的時候攻臀,實(shí)際是從本地的pod cache中尋找對應(yīng)的庫進(jìn)行安裝,所以在Spec中必須同時包含源碼版本和靜態(tài)包版本堡赔。
我選擇使用subspec:SourceModesubspec:FrameworkMode來承載兩種版本的內(nèi)容善已,并由subspec:Core解析執(zhí)行pod install時傳入的FX=all(或dependency)參數(shù)换团,判斷安裝時應(yīng)該使用哪種版本宫蛆。

Pod::Spec.new do |s|
  
  ...
  
  #靜態(tài)包模式
  s.subspec 'FrameworkMode' do |fm|
    fm.vendored_frameworks = '${POD_NAME}/${POD_NAME}SDK/*.framework'
    # fm.resource = '${POD_NAME}/${POD_NAME}SDK/*.bundle'
  end

  #源碼模式
  s.subspec 'SourceMode' do |sm|
    sm.source_files = [
      '${POD_NAME}/Classes/**/*'
    ]
    sm.public_header_files = [
      '${POD_NAME}/Classes/**/*.h'
    ]
    # sm.resource_bundles = {
    #   '${POD_NAME}' => ['${POD_NAME}/Assets/**/*.png']
    # }
  end

  #核心代碼
  s.subspec 'Core' do |core|
    # FX=all pod install; 所有庫都使用framework模式安裝
    isAllFX = ENV['FX'] == "all" || ENV['${POD_NAME}_FX'] == "all"; 
    # FX=dependency pod install; 依賴庫使用framework模式安裝
    isDependencyFX = ENV['FX'] == "dependency" || ENV['${POD_NAME}_FX'] == "dependency"; 
    isDependency = !!__FILE__[".cocoapods/repos"];
    if isAllFX || (isDependency && isDependencyFX)
      core.dependency '${POD_NAME}/FrameworkMode'
    else
      core.dependency '${POD_NAME}/SourceMode'
    end

    # core.public_header_files = 'Pod/Classes/**/*.h'
    # core.frameworks = 'UIKit', 'MapKit'
    # core.dependency 'AFNetworking', '~> 2.3'

    # core.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
  end
  s.default_subspec = 'Core'
end
  1. 業(yè)務(wù)組件Pod庫的*.podspec中關(guān)于資源想虎、代碼引用的改動

由于業(yè)務(wù)組件之間可能會互相調(diào)用對外接口舌厨,而并不需要引用完整Pod庫裙椭。
所以我把對外接口的聲明文件(即TKModule+*.h文件)單獨(dú)封裝為subspec:Interface署浩。
對外接口的實(shí)現(xiàn)內(nèi)容(即TKModule+*.m文件)依然要添加到subspec:SourceMode筋栋。
此外二汛,使用者可能并未在本地聲明本業(yè)務(wù)組件的對外接口肴颊,所以安裝源碼版本時應(yīng)該同時安裝subspec:Interface婿着。
至于靜態(tài)包版竟宋,它本就是由源碼版本編譯得來的,所以其中已經(jīng)包含了對外接口的聲明文件徒欣。

Pod::Spec.new do |s|
  ...
  
  #源碼模式
  s.subspec 'SourceMode' do |sm|
    sm.source_files = [
      '${POD_NAME}/Classes/**/*',
      '${POD_NAME}/Interface/**/*.m'
    ]
    ...
  end

  #對外接口
  s.subspec 'Interface' do |interface|
    interface.source_files = [
      '${POD_NAME}/Interface/**/*.h',
    ]
    interface.public_header_files = [
      '${POD_NAME}/Interface/**/*.h'
    ]
  end

  #核心代碼
  s.subspec 'Core' do |core|
    ...
    if isAllFX || (isDependency && isDependencyFX)
      core.dependency '${POD_NAME}/FrameworkMode'
    else
      core.dependency '${POD_NAME}/SourceMode'
      core.dependency '${POD_NAME}/Interface'
    end
    ...
  end
  s.default_subspec = 'Core'
end
  1. 為剛創(chuàng)建的Pod庫添加本地配置

通過我的模版創(chuàng)建的Pod庫打肝,在進(jìn)行開發(fā)前須要添加一些本地配置粗梭。當(dāng)然也可以使用自己的模版去避免了這些手動操作断医。

  1. 添加Git倉庫的遠(yuǎn)程映射
$ git@github.com:xxx/xxx.git
  1. 為Git倉庫安裝Git LFS
$ git lfs install
  1. 修改podspec中的本地配置
Pod::Spec.new do |s|
s.summary          = 'XXX'
s.description      = 'XXXX'
s.homepage         = 'https://github.com/xxx/xxx'
s.source           = { :git => 'https://github.com/xxx/xxx.git', :tag => s.version.to_s }
  1. 在Podfile中添加私有的Specs地址
source 'https://github.com/xxxx/Specs.git'

Pod-Pipeline介紹

該工具整合了Git和CocoaPods的一些功能奏纪,可以幫助我更簡單地構(gòu)建和發(fā)布項(xiàng)目亥贸。

#安裝
$ gem install pod-pipeline

Pod-Pipeline和CocoaPods都是基于CLAide(Comand Line aide)實(shí)現(xiàn)命令行功能的,所以基本用法是一致的荣挨,很容易上手默垄。

$ ppl --help
Usage:

    $ ppl COMMAND

      Pod-Pipeline 是 CocoaPods 的流水線工具.

Commands:

    + build     項(xiàng)目構(gòu)建
    + new       創(chuàng)建新項(xiàng)目
    + publish   項(xiàng)目發(fā)布
    + scan      項(xiàng)目掃描
    + update    項(xiàng)目更新

Options:

    --help      展示改命令的介紹面板

通常用法:

  1. 是在完成需求開發(fā)并提交修改后口锭。
  2. 在Demo目錄執(zhí)行pod install鹃操,保證Demo對Pod庫源碼引用正常荆隘。
  3. 在Pod目錄執(zhí)行下方命令
$ ppl publish\
 --repo=xxx\
 --build-arch=arm64,armv7\
 --build-combine=local\
 --update-channel=version,git\
 --repo-push-sources=https://github.com/xxxx/Specs.git\
 --repo-push-allow-warnings

第2步中生成的Podfile.lock改動椰拒,會在ppl update git命令執(zhí)行過程中和*.podspec的改動一同提交

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末燃观,一起剝皮案震驚了整個濱河市缆毁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌积锅,老刑警劉巖爽彤,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缚陷,居然都是意外死亡适篙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門箫爷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚷节,“玉大人,你說我怎么就攤上這事虎锚×蛱担” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵窜护,是天一觀的道長效斑。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么滨溉? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任勤家,我火速辦了婚禮乐设,結(jié)果婚禮上蠕啄,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布前硫。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪递宅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天翔忽,我揣著相機(jī)與錄音胡野,去河邊找鬼。 笑死熊响,一個胖子當(dāng)著我的面吹牛剔难,可吹牛的內(nèi)容都是我干的环鲤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞭空,長吁一口氣:“原來是場噩夢啊……” “哼旧找!你這毒婦竟也來了鞭缭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烹棉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挺举。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡汇歹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斤斧,到底是詐尸還是另有隱情折欠,我是刑警寧澤盗忱,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布扇谣,位于F島的核電站鸯绿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一簿训、第九天 我趴在偏房一處隱蔽的房頂上張望强品。 院中可真熱鬧,春花似錦屈糊、人聲如沸的榛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夫晌。三九已至,卻和暖如春昧诱,著一層夾襖步出監(jiān)牢的瞬間晓淀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工盏档, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凶掰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像锄俄,于是被迫代替她去往敵國和親局劲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容