CocoaPods私有庫(kù)的二進(jìn)制化

前言

假設(shè)你已經(jīng)非常熟練的使用cocoapods來(lái)管理私有庫(kù),并且實(shí)現(xiàn)了組件化的APP設(shè)計(jì)架構(gòu)晾剖。這篇文章將會(huì)幫助你將私有庫(kù)編譯成二進(jìn)制文件,這樣做的好處是會(huì)大大縮短編譯工程的時(shí)間沽损,提升工作的效(bi)率(ge).

目標(biāo)

我們當(dāng)前最重要的目標(biāo)是將私有庫(kù)編譯成二進(jìn)制文件,但是也有諸多限制條件:

  • 盡量做到不修改原來(lái)私有庫(kù)的所有版本的任何代碼
  • 在任何時(shí)候都可以隨意切換源碼和二進(jìn)制文件,以方便調(diào)試
  • 所依賴的第三方庫(kù)不參與二進(jìn)制編譯

步驟

新建私有Cocoapods庫(kù)

這里我將新建一個(gè)示例的私有庫(kù)工程,對(duì)制作私有Cocoapods庫(kù)不是非常了解的,可以去先看看其他文章.

$ pod lib create CCDemoLib

按照提示信息依次填寫(xiě)選項(xiàng),完成之后Xcode會(huì)被自動(dòng)打開(kāi)到CCDemoLib的pod工程.刪除pod目錄下的ReplaceMe.m文件.
這里,我將建立兩個(gè)子庫(kù).一個(gè)CCUICCNetwork,一個(gè)CCDemo.h的頭文件.該頭文件用來(lái)導(dǎo)入所有子庫(kù)的頭文件.CCDemoLib.podspec文件如下:

Pod::Spec.new do |s|
  s.name             = 'CCDemoLib'
  s.version          = '0.1.0'
  s.summary          = '一個(gè)測(cè)試二進(jìn)制化的私有庫(kù)'
  s.description      = '一個(gè)測(cè)試二進(jìn)制化的私有庫(kù)'
  s.homepage         = 'https://github.com/zhahao/CCDemoLib'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'zhahao' => '506902638@qq.com' }
  s.source           = { :git => 'https://git.coding.net/zhahao/CCDemoLib.git', :tag => s.version.to_s }
  s.ios.deployment_target = '8.0'

  s.source_files = 'CCDemoLib/Classes/CCDemo.h'

  s.subspec 'CCNetwork' do |ss|
     ss.source_files = 'CCDemoLib/Classes/CCNetwork/**/*'
    ss.dependency 'AFNetworking', '~> 2.3'
  end

  s.subspec 'CCUI' do |ss|
    ss.source_files = 'CCDemoLib/Classes/CCUI/**/*'
    ss.dependency 'SDWebImage', '~> 4.1.0'
  end

end

執(zhí)行pod install,安裝完成之后的目錄結(jié)構(gòu)是這樣的:

目錄結(jié)構(gòu)

我們將工程推到遠(yuǎn)程Git倉(cāng)庫(kù)

?  CCDemoLib git:(master) ? git add origin https://git.coding.net/zhahao/CCDemoLib.git
?  CCDemoLib git:(master) ? git add .
?  CCDemoLib git:(master) ? git commit -m 'init project'
?  CCDemoLib git:(master) git push origin master

發(fā)布到私有索引庫(kù)

添加完tag,推到索引庫(kù),這里其實(shí)不需要驗(yàn)證的,如果有錯(cuò)誤,自然也就推送不進(jìn)去.等幾分鐘...

?  CCDemoLib git:(master) git tag 0.1.0
?  CCDemoLib git:(master) git push --tags
?  CCDemoLib git:(master) pod repo push CCPodSpec CCDemoLib.podspec --allow-warnings

然后,成功了~ 到此,我們就發(fā)布了一個(gè)正常的私有庫(kù).

二進(jìn)制化

前面簡(jiǎn)單介紹了下私有庫(kù)的創(chuàng)建,接下來(lái)介紹私有庫(kù)的二進(jìn)制化方案.

iOS里面的靜態(tài)庫(kù)分為.framework和.a兩種類型,它們的區(qū)別是.framework會(huì)包含資源文件,而.a文件是不包含資源文件.一般情況下我們都需要.a類型的靜態(tài)庫(kù),這樣每個(gè)組件的資源都不會(huì)安裝到主工程里面去,避免了資源的重復(fù)問(wèn)題,但是主工程里面需要導(dǎo)入需要的所有的圖片等資源.

下面以.framework為例子:

生成framework

直接上圖:

新建一個(gè)framework類型的target,名字是CCDemoBinary
選擇framework,如果生成.a選擇Static Library
編輯CCDemoBinary的scheme
選擇release模式
在Build Settings里面
在Build Settings里面
刪除
將下面的直接拖到CCDemoBinary文件夾下
在Build Phases下,將頭文件全部拖到public下
選真機(jī)的,不要模擬器

修改podfile文件

WX20170930-222316.png

執(zhí)行 'pod install',等安裝完成之后,編譯剛才的CCDemoBinarytarget,找到CCDemoBinary.framework,位置如下:

WX20170930-222609.png

右鍵show in finder 找到CCDemoBinary.framework文件,選Release-iphoneos文件夾里面的那個(gè).

WX20170930-222731.png
在pod文件夾下面

至此,framework已經(jīng)搞定了,接下來(lái)我們要去修改CCDemoLib.podspec文件

修改CCDemoLib.podspec

之前說(shuō)過(guò),我們需要隨時(shí)切換源碼和二進(jìn)制文件,所以我們可以利用環(huán)境變量來(lái)處理這兩種情況

$ CCDemoLib_Source=1 pod install

CCDemoLib_Source就是設(shè)置了一個(gè)環(huán)境變量,在.podspec文件中,可以使用ENV['CCDemoLib_Source']來(lái)獲取

修改之后的CCDemoLib.podspec文件

Pod::Spec.new do |s|
  s.name             = 'CCDemoLib'
  s.version          = '0.1.0'
  s.summary          = '一個(gè)測(cè)試二進(jìn)制化的私有庫(kù)'
  s.description      = '一個(gè)測(cè)試二進(jìn)制化的私有庫(kù)'
  s.homepage         = 'https://github.com/zhahao/CCDemoLib'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'zhahao' => '506902638@qq.com' }
  s.source           = { :git => 'https://git.coding.net/zhahao/CCDemoLib.git', :tag => s.version.to_s }
  s.ios.deployment_target = '8.0'


if ENV['CCDemoLib_Source'] || ENV['AllLib_Source']
    s.source_files = 'CCDemoLib/Classes/CCDemo.h'
    s.subspec 'CCNetwork' do |ss|
        ss.source_files = 'CCDemoLib/Classes/CCNetwork/**/*'
        ss.dependency 'AFNetworking', '~> 2.3'
    end

    s.subspec 'CCUI' do |ss|
        ss.source_files = 'CCDemoLib/Classes/CCUI/**/*'
        ss.dependency 'SDWebImage', '~> 4.1.0'
    end
else
    s.source_files = 'CCDemoLib/Classes/**/*.h'
    s.vendored_frameworks = 'CCDemoLib/Products/CCDemoBinary.framework'
    s.dependency 'AFNetworking', '~> 2.3'
    s.dependency 'SDWebImage', '~> 4.1.0'
end

end

中間的if...else...end的邏輯中AllLib_Source環(huán)境變量的意思是所有私有庫(kù)判斷,CCDemoLib_Source是當(dāng)前的私有庫(kù)判斷.

當(dāng)設(shè)置環(huán)境變量為true,那么,我們這個(gè)pod庫(kù)的source_filesdependency都是引用源碼.否則,我們就將source_files全部設(shè)置為頭文件.并且設(shè)置vendored_frameworks為剛才拖進(jìn)來(lái)的framework,第三方庫(kù)全部為依賴關(guān)系,也就是全部為源碼.

  • 當(dāng)我想讓所有私有庫(kù)顯示源碼,只需要設(shè)置AllLib_Source=1
  • 當(dāng)我們指定某一個(gè)私有庫(kù)為源碼,其他都為二進(jìn)制,只需要設(shè)置CCDemoLib_Source=1
  • 當(dāng)我們想讓所有私有庫(kù)都是二進(jìn)制,那么就什么環(huán)境變量都不設(shè)置

測(cè)試工程的framework私有庫(kù)的結(jié)構(gòu)目錄如下:

二進(jìn)制的私有庫(kù)文件目錄結(jié)構(gòu)

可以看到,所有的.m文件全部沒(méi)有了.
自此,我們就完成了大部分工作.最后就是要將修改后的所有文件提交到Git遠(yuǎn)程倉(cāng)庫(kù)和pod索引庫(kù).

提交修改,更新索引庫(kù)

git提交修改:

?  CCDemoLib git:(master) ? git add .
?  CCDemoLib git:(master) ? git commit -m '二進(jìn)制化該私有庫(kù)'
?  CCDemoLib git:(master) git push origin master

刪除之前的tag

?  CCDemoLib git:(master) git tag
0.1.0
?  CCDemoLib git:(master) git tag -d 0.1.0
?  CCDemoLib git:(master) git push origin :0.1.0

設(shè)置新的同名tag并提交

?  CCDemoLib git:(master) git tag 0.1.0
?  CCDemoLib git:(master) git push --tags

提交新的索引庫(kù)

?  CCDemoLib git:(master) pod repo push CCPodSpec CCDemoLib.podspec --allow-warnings

等幾分鐘成功之后,可以查看一下索引庫(kù)是否更新了該版本的.podspec文件.

到此為止,我們所有的操作都沒(méi)有修改源碼,也實(shí)現(xiàn)了我們之前的三個(gè)限制.

清除緩存

由于pod update的原理是先從緩存中讀取,即Podfile.lock文件,由于我們沒(méi)有修改私有庫(kù)的版本號(hào),所以我們需要先清空緩存,讓索引庫(kù)重新從遠(yuǎn)程拉取.podspec文件. 所以,當(dāng)你每次二進(jìn)制化一個(gè)私有庫(kù)成功之后,都需要清空緩存,不然執(zhí)行pod install之后都是源碼,而不是二進(jìn)制文件.

?  CCDemoLib git:(master) pod cache clean --all

使用

在你的APP主工程里面,執(zhí)行pod install或者pod update:

  • $ CCDemoLib_Source=1 pod update 只安裝了CCDemoLib私有庫(kù)為源碼
  • $ pod update 安裝了所有私有庫(kù)為二進(jìn)制
  • $ AllLib_Source=1 pod update 安裝了所有私有庫(kù)為源碼

我們新建了一個(gè)測(cè)試主工程CocoapodsBinary

platform :ios, '8.0'

use_frameworks!

source 'https://git.coding.net/zhahao/CCPodSpec.git'
source 'https://github.com/CocoaPods/Specs.git'


target 'CocoapodsBinary' do
  pod 'CCDemoLib'
end

執(zhí)行pod install,完成之后pod目錄結(jié)構(gòu)上如下:

目錄結(jié)構(gòu)

自此,我們就徹底完成了私有庫(kù)的二進(jìn)制!

核心

私有庫(kù)的二進(jìn)制化核心就是將原來(lái)的私有庫(kù)編譯出一個(gè)framework,然后修改.podspec文件,根據(jù)不同的環(huán)境變量獲取不同的對(duì)私有庫(kù)的描述信息,這樣通過(guò)pod進(jìn)行安裝和更新的時(shí)候,安裝了不同的文件暂筝。

下一期,我將使用fastlane來(lái)簡(jiǎn)化一些流程,避免做一些重復(fù)的操作和可能帶來(lái)的操作失誤.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饭豹,一起剝皮案震驚了整個(gè)濱河市它褪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌包吝,老刑警劉巖砖瞧,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荣堰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡啃洋,警方通過(guò)查閱死者的電腦和手機(jī)逮壁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)忧饭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人亚斋,你說(shuō)我怎么就攤上這事作媚。” “怎么了帅刊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵纸泡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赖瞒,道長(zhǎng)女揭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任栏饮,我火速辦了婚禮吧兔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袍嬉。我一直安慰自己境蔼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布伺通。 她就那樣靜靜地躺著箍土,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罐监。 梳的紋絲不亂的頭發(fā)上吴藻,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音弓柱,去河邊找鬼沟堡。 笑死疮鲫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弦叶。 我是一名探鬼主播俊犯,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伤哺!你這毒婦竟也來(lái)了燕侠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤立莉,失蹤者是張志新(化名)和其女友劉穎绢彤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜓耻,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茫舶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刹淌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饶氏。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖有勾,靈堂內(nèi)的尸體忽然破棺而出疹启,到底是詐尸還是另有隱情,我是刑警寧澤蔼卡,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布喊崖,位于F島的核電站,受9級(jí)特大地震影響雇逞,放射性物質(zhì)發(fā)生泄漏荤懂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一塘砸、第九天 我趴在偏房一處隱蔽的房頂上張望节仿。 院中可真熱鬧,春花似錦谣蠢、人聲如沸粟耻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霜威,卻和暖如春谈喳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戈泼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工婿禽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏僧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓扭倾,卻偏偏與公主長(zhǎng)得像淀零,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膛壹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355