git公有转私有_【IT新手之路】客户端组件化之私有库搭建
背景
在組件化之前,小花錢包 App 項目代碼,在代碼結(jié)構(gòu),代碼質(zhì)量和層級劃分上都處于一個比較亂的狀態(tài)。這樣的項目條件在業(yè)務(wù)發(fā)展不是很快的時候,是可以適應(yīng)需求的,并且能一定程度地保證開發(fā)效率。但隨著業(yè)務(wù)方向的多樣和產(chǎn)品需求的快速迭代要求,這時單一工程開發(fā)模式就會顯露出一些弊端:耦合比較嚴(yán)重(因為沒有明確的約束,「組件」間引用的現(xiàn)象會比較多)
容易出現(xiàn)沖突,包括代碼沖突和布局沖突等情況(尤其是使用 Xib和storybord,還有就是 Xcode Project)
項目拓展性不高,復(fù)用和可移植性不強
業(yè)務(wù)方的開發(fā)效率不夠高(只關(guān)心自己的組件,卻要編譯整個項目,與其他不相干的代碼糅合在一起)
為了解決這些問題,就采取了「組件化」策略,注:這里的組件化,也就是大家說的『模塊化』,不是在主工程中用文件夾來區(qū)分模塊,而是指將獨立模塊抽調(diào)成 CocoaPods 庫、或者其他形式的庫文件,成為一個獨立工程,每個組件即代表一個 CocoaPods 私有庫。
??一、為什么要組件化?有哪些優(yōu)勢?
1.組件和組件之間沒有明確的約束;
2.組件化采用cocoapod管理,同屬于git私有庫,便于代碼復(fù)用和管理,解決人多(更好的協(xié)作)、需求多(更好的功能模塊劃分)的問題;
3.組件單獨開發(fā)、單獨測試,不用揉入主項目中開發(fā),測試也可以針對性的測試;
4.解決項目模塊間的代碼耦合問題;
5.自由選擇開發(fā)姿勢(MVC / MVVM)
6.提高業(yè)務(wù)開發(fā)效率
?二、怎么劃分組件化?
1.基礎(chǔ)組件
1.按功能分庫,不涉及產(chǎn)品業(yè)務(wù)需求,跟庫Library類似
2.通過良好的接口供上層業(yè)務(wù)組件和功能組件調(diào)用
3.不寫入產(chǎn)品定制邏輯,通過擴展接口完成定制
2.功能組件
1.App產(chǎn)品內(nèi)定制通用組件;(各個業(yè)務(wù)模塊依賴使用,但需要保持好定制擴展的設(shè)計)
2.公共通用組件,能夠完成某個功能點,例如輪播器組件;
3.對外暴露數(shù)據(jù)交互接口,內(nèi)部實現(xiàn)細(xì)節(jié)只有組件自己清楚,數(shù)據(jù)交互方面一般使用代碼、block和屬性來完成,不建議組件中使用通知進(jìn)行交互,不利于維護(hù)管理;
3.業(yè)務(wù)組件
1.業(yè)務(wù)功能間相對獨立,相互間沒有Model共享的依賴;
2.業(yè)務(wù)之間的頁面可以直接進(jìn)行跳轉(zhuǎn);
3.業(yè)務(wù)之間的邏輯Action調(diào)用只通過由當(dāng)前業(yè)務(wù)模塊提供,各自與后臺交互;
?三、組件化工程需要解決的問題
資源打包
1.對于 UI 界面,需要做的是資源打包,在模塊拆分中,要非常注意資源分割。因為業(yè)務(wù)模塊的劃分,不僅僅是是代碼抽出,也有資源抽出。
2.資源庫包括但不僅限于:.xib 文件、聲音資源、圖片資源、純文本文件以及視頻資源
3.所有的資源文件,應(yīng)當(dāng)單獨創(chuàng)立 Res 文件夾,放入其中,并在 .podspec 中表明資源文件路徑 s.resources = ["Source/*/.xib", "Source/Res/*.xcassets"]
??四、組件維護(hù)問題?
1.gitLab統(tǒng)一管理
2.組件的維護(hù)持續(xù)更新是需要一直做的,完善組件功能,優(yōu)化組件性能,提高組件適用范圍
3.組件的管理跟git的tag是一一對應(yīng),每個tag版本都要有對應(yīng)的記錄
實操部分(以網(wǎng)絡(luò)庫組件為例說明)
??一、 設(shè)計理念
關(guān)于網(wǎng)絡(luò)通信模塊的設(shè)計,我個人認(rèn)為應(yīng)該是每一個HTTPS請求都應(yīng)該獨立互不干擾,就是你封裝的POST/GET方法都會創(chuàng)建一個臨時的對象,而長連接一般只維持一個實例對象采用單例的方式創(chuàng)建。我會為每一個HTTPS 接口請求創(chuàng)建一個API對象,在里面請求數(shù)據(jù),當(dāng)然了為了避免請求代碼的重復(fù)編寫可以建立一個BASE API類,子類調(diào)用父類的請求方法就行了,不同的只是接口與參數(shù)。
? ?二、 終端操作,組件創(chuàng)建
準(zhǔn)備工作(中心庫的創(chuàng)建)
1.首先在gitLab上創(chuàng)建一個項目存放私有Repo源,repo地址https://code.xhqb.io/appComponent/XHSpecs.git ,這個地址也叫中心庫,以后私有組件都會存放在這里;
2.本地添加私有源 終端執(zhí)行命令pod repo add XHSpecs https://code.xhqb.io/appComponent/XHSpecs.git(這個步驟已經(jīng)完成,后續(xù)無需再執(zhí)行)
3.以上操作完成 進(jìn)入~/.cocoapods/repos目錄下至少會有2個文件夾XHSpecs和master, master文件下面存放的是公有源文件,XHSpecs目錄下存放我們私有源文件
4.基本準(zhǔn)備工作完成 ?#### 創(chuàng)建組件項目(以 XHNetwork 為案例)
1.0 新建項目XHNetwork,并在XHNetwork.xcodeproj同級目錄中添加Classes文件夾,用來存放pod需要導(dǎo)入的文件。
2.0 終端cd至XHNetwork目錄下執(zhí)行命令pod spec create XHNetwork。
3.0 執(zhí)行命令vim XHNetwork.podspec編輯podspec文件,具體如何編輯可參考第三部分spec文件寫法說明。
4.0 編輯完成XHNetwork.podspec文件之后,執(zhí)行pod lib lint --allow-warnings命令,進(jìn)行本地驗證,驗證通過執(zhí)行以下步驟。
5.0 執(zhí)行g(shù)it操作:
5.1 git add .
5.2 git commit -m 'log'
5.3 git remote (如果沒有分支origin,執(zhí)行5.3.1命令)
5.3.1?git remote add origin https://code.xhqb.io/appComponent/XHNetwork.git
5.4 git push origin master
5.5 git tag -a 'version' -m 'log' tag一定要和podspec中的version一致
5.6 git push --tags --tags為了把剛才添加的tag提交上去
6.0 執(zhí)行命令 pod spec lint --allow-warnings 此步驟同步驟4操作一致,步驟4為本地驗證,步驟6為spec文件驗證,會注冊驗證結(jié)果
6.1 如果此私有組件依賴于其他私有組件,那么執(zhí)行命令改為 pod spec lint --allow-warnings --source=https://code.xhqb.io/appComponent/XHSpecs.git,命令后面跟上私有源地址
7.0 執(zhí)行命令pod repo push XHSpecs XHNetwork.podspec --verbose --allow-warnings 注:XHSpecs即私有源中心倉庫,此步驟為將驗證成功的podspec索引文件上傳到中心庫
7.1 如果步驟6命令有跟私有源地址,那么此命令也應(yīng)該加上私有源地址
8.0 除了步驟6和步驟7這種驗證上傳方式,另外提供trunk驗證方式;
8.1 pod trunk register 郵箱地址 ‘用戶名’ —verbose //郵箱注冊trunk
8.2 進(jìn)入郵箱,點擊trunk鏈接驗證
8.3 驗證成功之后,執(zhí)行 pod trunk push XHNetwork.podspec ?####?
?三、spec文件寫法說明 ?
?Pod::Spec.new do |s|?
?name: 組件名稱 s.name = "XHNetwork"?
?version : 組件版本,和項目tag一致,install命令會根據(jù)這個版本號去下載指定tag版本的代碼 s.version = "0.0.7"?
summary : 摘要,長度一般比description短 s.summary = "XHNetwork"
description : 組件描述,文本長度必須比summary文本長度長 s.description = "A short description of XHNetwork lib" ?
?homepage : 組件主頁地址 s.homepage = "https://code.xhqb.io/appComponent/XHNetwork" ?
license : 授權(quán)協(xié)議,默認(rèn)填寫為MIT` s.license = "MIT" # s.license = { :type => "MIT", :file => "FILELICENSE" } ?
author : 作者、郵箱 s.author = { "趙正華" => "zhaozhenghua@xhqb.com" }?
?source : 項目git地址,tag值與s.verison版本一致 s.source = { :git => "https://code.xhqb.io/appComponent/XHNetwork.git", :tag => "#{s.version}" } ?
源文件 Classes文件夾必須放在根目錄下才能被找到 s.sourcefiles = "Classes/.{h,m}" #spec.source_files = 'Classes//.{h,m}', 'MoreClasses/*/.{h,m}' ?
公有頭文件 #s.publicheader_files = "Classes/*/.h"
匹配規(guī)則如下:
1.*匹配所有文件
2.c*匹配以名字C開頭的文件
3.*c匹配以名字c結(jié)尾的文件
4.c匹配所有名字包含c的文件
5.**文件夾以及遞歸子文件夾
6.?任意一個字符(注意是一個字符)
7.[set] 匹配多個字符,支持取反
8.{p,q} 匹配名字包括p 或者 q的文件?
圖片及音頻資源文件的加載方式 #spec.resource = 'Resources/HockeySDK.bundle' #spec.resources = ['Images/.png', 'Sounds/'] ?
是否是ARC,默認(rèn)true,如果不是,會自動添加-fno-objc-arc compiler flag s.requiresarc = true ?支持的平臺,如果不寫默認(rèn)支持所有平臺,以下表示只支持ios平臺,系統(tǒng)版本8.0以上 s.platform = :ios, "8.0" ?
依賴的系統(tǒng)的框架 s.frameworks = 'QuartzCore', 'CoreData' ?
如果在高版本的OS中調(diào)用新增的功能,并且在低版本的OS中依然能夠運行,那么就要用到weakframeworks.如果引用的某些類或 者接口在低版本中并不支持,對于不支持的接口,可以在運行的時候判斷,這樣程序不會出錯,如果不weak引用,程序在低版本下啟動的時候就會崩潰掉 s.weakframework = 'MessageUI' ?
配置信息,根據(jù)個人需要填寫 # s.xcconfig = { "HEADERSEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } ?
依賴的第三方, 沒有指定第三方依賴庫,默認(rèn)去下載最新的庫版本 s.dependency 'XHAFNetworking' ?
? ?四、私有組件配置用法
結(jié)尾
上面就是在小花錢包項目中進(jìn)行 模塊化/組件化 的搭架操作流程,希望這篇文章能對有同樣需求的人有所幫助。如果各位在看了這篇文章之后還有什么疑問或者是發(fā)現(xiàn)有什么問題都可以在文后面留言。?共同進(jìn)步,Best wishes!
總結(jié)
以上是生活随笔為你收集整理的git公有转私有_【IT新手之路】客户端组件化之私有库搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将矩阵转为一行_LeetCode1253
- 下一篇: linux下python安装opencv