【iOS開發工程化——開發中】:組件化開發,使用CocoaPods管理私有庫

目錄
一、組件化開發
二、使用CocoaPods管理私有庫
? 1、創建我們自己的podspec文件倉庫,并連接到CocoaPods
? 2、創建私有庫
? 3、編寫私有庫的源代碼和podspec文件,并打tag
? 4、發布私有庫的podspec文件到我們自己的podspec文件倉庫
? 5、升級私有庫
? 6、像三方庫那樣使用私有庫


一、組件化開發


組件化開發是一個App最大一層的架構,使用組件化開發可以很好地完成代碼解耦和并行開發。所謂代碼解耦是指我們可以把項目里一些基礎或具有獨立功能的代碼給抽離成一個一個的基礎組件庫或功能組件庫,這樣這些組件庫就可以真正復用到任何一個需要使用到它們的項目里;所謂并行開發是指我們可以把項目里各業務線的項目抽離成一個一個的業務組件庫,這樣各業務線的項目就可以獨立開發、獨立打包,完全不影響其它業務線的項目、也不受其它業務線的項目影響。

組件化開發主要分四層:

  • 最底層的是基礎組件庫

基礎組件庫是指那些不依賴于其它任何組件庫的組件庫,包括:UI庫(常用間距、常用字體大小&粗細、常用顏色、常用icon、常用View)、網絡庫(對三方庫的封裝)、Util庫(常用工具函數)、路由庫(搞路由庫的目的就是想讓界面與界面之間互相不知道對方的存在,僅僅通過路由組件來進行跳轉,從而很好地做到多業務線項目之間界面的解耦,當然同一個業務線內也可以使用路由組件來解耦界面之間的互相依賴。就像Flutter里的路由管理那樣,第一步先搞個Router類,這個類里會有一個路由表的屬性,我們需要把路由名和界面一一映射到這個路由表里;第二步就是搞一個類似Navigator的路由管理類,通過給它的push、pop等方法傳一個路由名來打開新界面和退出新界面;第三步就是傳值了,往新界面的傳值可以在push方法里搞一個id類型的params,新界面返回時給上一個界面傳值可以通過block的方式)。

  • 往上一層的是功能組件庫

功能組件庫是指那些跟業務無關的、可以被多個業務線的項目復用的組件庫,它們內部可能會依賴基礎組件庫,比如我就負責編寫了項目中的:權限管理庫、相機相冊庫、視頻壓縮庫、原生和Flutter交互的中間容器庫等功能組件庫。

  • 再往上一層的是業務組件庫

業務組件庫是指那些跟業務有關的組件庫,實際開發中我們經常按模塊來劃業務組件庫,它們內部可能依賴基礎組件庫和功能組件庫,比如登錄注冊庫、首頁IM庫、通訊錄庫、發現頁庫、個人中心庫、學生答題庫、老師批改庫等。

  • 最上一層的是宿主工程

宿主工程就像一個插座一樣,你需要把哪個業務發布給用戶使用,就把哪個業務組件庫像個插頭一樣插進來就行,宿主工程本身并不負責任何業務,它就像一個平臺一樣來承載各個業務從而形成一款完成的App。

注意在設計和編寫組件庫的時候,要符合單一功能原則,即一個組件庫只做一類事,一個組件只做一件事,這樣可以降低組件之間的耦合性,提高組件的內聚性和健壯性。比如UI庫和網絡庫雖然同屬于基礎庫,但是我們得搞兩個庫來分別編寫它們,而不要把它們塞到同一個庫里,這樣更上層的庫就可以按需來依賴這些庫了。同時要知道組件庫的開發不是一蹴而就的,可以隨著項目開發的深入根據實際情況逐步把一些復用性高的東西移入相應的組件庫中,不要為了開發組件庫而開發組件庫。


二、使用CocoaPods管理私有庫


接下來我們就看看在iOS開發中如何實現組件化開發。這篇文章中,會有一個名字叫做TestApp的宿主工程,會有一個名字叫做TestSpecs的podspec文件倉庫,會有一個名字叫做TestPrivateLib的私有庫。

1、創建我們自己的podspec文件倉庫,并連接到CocoaPods

打開終端,執行pod repo命令,可見此時CocoaPods只連接了一個podspec文件倉庫——它就是CocoaPods Master Repo,遠程倉庫的地址為https://cdn.cocoapods.org/,本地倉庫的地址為/Users/yiyi/.cocoapods/repos/trunk

我們還可以執行pod repo --help命令,查看pod repo支持的其它命令。

現在我們正式開始創建我們自己的podspec文件倉庫,這個倉庫就是用來存放我們所有私有庫、所有版本的podspec文件的。首先創建一個podspec文件遠程倉庫,這里取名為TestSpecs。

然后執行pod repo add podspec文件倉庫名 podspec文件倉庫的SSH地址或HTTPS地址命令把我們自己的podspec文件倉庫連接到CocoaPods。

而且pod repo add podspec文件倉庫名 podspec文件倉庫的SSH地址或HTTPS地址命令還會自動把我們自己的podspec文件遠程倉庫clone下來成為一個podspec文件本地倉庫。

再次輸入pod repo命令,可見此時CocoaPods就連接了兩個podspec文件倉庫,一個是CocoaPods官方的,一個是我們自己的。

至此,我們就創建好了我們自己的podspec文件倉庫,并連接到了CocoaPods。

2、創建私有庫

現在就要開始創建私有庫了,這里取名為TestPrivateLib。cd到你要把私有庫創建在什么目錄下,這里就創建在桌面了,執行pod lib create 私有庫名命令,并根據提示選擇相應的配置項,就可以創建一個私有庫的本地倉庫了。

創建成功后,我們桌面上就多了一個私有庫TestPrivateLib的本地倉庫,此時我們可以做一次“init commit”的commit操作。

接下來我們就創建一個私有庫TestPrivateLib的遠程倉庫,關聯到本地倉庫,并做一次push操作。

至此,我們就創建好了私有庫。

3、編寫私有庫的源代碼和podspec文件,打tag

創建好了私有庫,接下來我們就可以編寫私有庫的源代碼了。打開示例項目的.xcworkspace文檔,找到我們的私有庫。

把私有庫里自帶的ReplaceMe.swift文件刪掉。

把私有庫里自帶的資源文件夾和源代碼文件夾添加到私有庫里。

現在私有庫的目錄結構應該長這樣。

接下來我們就可以在Class文件夾下編寫源代碼了,假設我們要在這個私有庫里添加一個測試控制器,這里取名為TestViewController,它上面有一個UIImageView。

假設此時我們就已經完成了私有庫源代碼的編寫,我們可能想要驗證一下源代碼開發得是否正確,這時就要用到示例項目了。打開示例項目的Podfile文件,可見示例項目已經默認通過本地依賴的方式依賴了我們的私有庫。

cd到示例項目,執行pod install命令來安裝我們的私有庫(注意:通過本地依賴時,第一次安裝私有庫需要執行pod install命令,后續私有庫有改動的話就不需要執行pod install命令了,直接運行示例項目就能獲取到私有庫最新的代碼,所以調試代碼時我們經常會采用本地依賴的方式。但是如果私有庫是新增了文件,那示例項目就必須得再次執行pod install命令才能安裝到最新的私有庫)。

安裝完成后,我們就可以在示例項目里使用一下我們私有庫里的TestViewController來驗證它編寫得是否正確了,這里假設點擊一下示例項目的ViewController就modal出私有庫里的TestViewController。

源代碼驗證無誤后,緊接著我們需要編寫一下私有庫的podspec文件,這里假設我們決定把此次私有庫發版的版本確定為1.0.0。(podspec是pod specification的縮寫,一個pod就是一個依賴庫,而specification就是說明書,所以podspec翻譯過來就是依賴庫的說明書,用來描述某一特定版本的該依賴庫)

至此,我們就編寫好了私有庫的源代碼和podspec文件,此時我們就可以commit、push代碼,并打一個1.0.0版本的tag push到遠程倉庫。

4、發布私有庫的podspec文件到我們自己的podspec文件倉庫

編寫好了私有庫的源代碼,我們的私有庫要想能像三方庫那樣被CocoaPods管理,就必須得把它的podspec文件發布到我們自己的podspec文件倉庫,而我們自己的podspec文件倉庫早已提前連接到了CocoaPods,那怎么發布呢?

cd到私有庫和示例項目的上一級目錄,執行pod lib lint命令來校驗一下我們的私有庫。

依然是cd到私有庫和示例項目的上一級目錄,執行pod sepc lint命令來校驗一下我們私有庫的podspec文件。

私有庫和podspec文件校驗通過后,依然是cd到私有庫和示例項目的上一級目錄,執行pod repo push podspec文件倉庫名 私有庫的podsepc文件名命令來將私有庫的podspec文件發布到我們自己的podspec文件倉庫的本地倉庫和遠程倉庫。

可見TestSpecs的本地倉庫和遠程倉庫就已經都有了私有庫、1.0.0版本的podspec文件。

至此,我們就發布好了1.0.0版本的私有庫。

5、升級私有庫

升級私有庫其實就是不斷重復執行3和4

1.0.0版本的TestPrivateLib,UIImageView只是一個紅色的方塊,現在我們開發2.0.0版本的TestPrivateLib,新增以下三個功能:

  • 使得UIImageView可以顯示一張本地圖片(演示私有庫加載資源文件)
  • 使得UIImageView可以通過SDWebImage顯示一張網絡圖片(演示私有庫使用三方庫)
  • 私有庫分離成若干個子庫(演示私有庫分子庫)

重復執行3:編寫私有庫的源代碼和podspec文件,打tag

功能一:使得UIImageView可以顯示一張本地圖片

首先我們要把圖片資源都放到TestPrivateLib的Assets目錄下。

然后修改下TestPrivateLib podspec文件里的資源文件的路徑。

接著就是編寫新的代碼了。

編寫完成后,cd到示例項目,執行一下pod install命令安裝最新的私有庫,因為我們新增資源文件了,驗證一下新代碼是否編寫有誤,驗證無誤后,commit、push代碼,就可以去開發下一個功能了。

功能二:使得UIImageView可以通過SDWebImage顯示一張網絡圖片

修改下TestPrivateLib podspec文件,在里面添加上對三方庫SDWebImge的依賴。

cd到示例項目,執行pod install命令,幫助我們的私有庫安裝上三方庫SDWebImage。

接著就是編寫新的代碼了。

編寫完成后,直接運行示例項目,驗證一下新代碼是否編寫有誤,驗證無誤后,commit、push代碼,就可以去開發下一個功能了。

功能三:私有庫分離成若干個子庫

我們在使用三方庫的時候,可能并不會用到三方庫所有的代碼,可能只會用到其中的一部分,所以為了減小包的大小,我們會希望只安裝其中我們需要的那部分代碼。出于這個考慮,好的開源庫作者都會為他們的開源庫添加子庫,以便我們能按需安裝相應的子庫。下面是AFNetworking的子庫:

我們在開發私有庫的時候也可以參考這種作法,把不同類型的代碼放到不同的子庫里,供使用者獨立安裝使用。假設我們的私有庫里新增了View和Model文件夾,它們下面分別新增了TestView.swift文件和TestModel.swift文件,并且我們還創建了一個ViewController文件夾,把TestViewController.swift文件移動到這個文件夾下了。

只分文件夾肯定是不夠的,因為podsepc文件里還是指定它們是一個庫。

所以我們還得在podsepc文件里真正為每個文件夾創建成子庫——即把庫分離為若干個子庫。

編寫完成后,cd到示例項目,執行一下pod install命令安裝最新的私有庫,因為我們新增文件了,驗證一下新代碼是否編寫有誤,驗證無誤后,因為所有的功能都開發完畢了,緊接著我們需要編寫一下私有庫的podspec文件,這里假設我們決定把此次私有庫發版的版本確定為2.0.0。

至此,我們就編寫好了2.0.0版本私有庫的源代碼和podspec文件,此時我們就可以commit、push代碼,并打一個2.0.0版本的tag push到遠程倉庫。

重復執行4:發布私有庫的podspec文件發布到我們自己的podspec文件倉庫

cd到私有庫和示例項目的上一級目錄,執行pod lib lint命令來校驗一下我們的私有庫。

依然是cd到私有庫和示例項目的上一級目錄,執行pod sepc lint命令來校驗一下我們私有庫的podspec文件。

私有庫和podspec文件校驗通過后,依然是cd到私有庫和示例項目的上一級目錄,執行pod repo push podspec文件倉庫名 私有庫的podsepc文件名命令來將私有庫的podspec文件發布到我們自己的podspec文件倉庫的本地倉庫和遠程倉庫。

可見TestSpecs的本地倉庫和遠程倉庫就已經都有了私有庫、2.0.0版本的podspec文件。

至此,我們就升級好了2.0.0版本的私有庫。

6、像三方庫那樣使用私有庫

去TestApp項目里修改一下Podfile如下:

執行pod install命令,還是安裝到所有的文件,這是正常的,因為我們依賴的就是整個庫。

但是如果我們把TestApp項目的Podfile改成只依賴TestPrivateLib的部分子庫:

再次執行pod install命令,就會只安裝子庫了。

完事。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容