目錄
一、組件化開發
二、使用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 lin
t命令來校驗一下我們私有庫的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
命令,就會只安裝子庫了。
完事。