iOS組件化--殼工程

新建工程LZDemo作為殼工程

1、添加Podfile文件
cd到你剛創(chuàng)建的工程目錄下,執(zhí)行以下語(yǔ)句

pod init

然后會(huì)發(fā)現(xiàn)你的工程目錄下多了Podfile文件


image.png

2、生成xcworkspace工程
執(zhí)行

pod install

3、新建一個(gè)Lib(自己起名)文件夾,用來(lái)存放組件庫(kù)(其他獨(dú)立工程)


image.png

然后cd到Lib下
執(zhí)行

pod lib create TRUNetworking

其中TRUNetworking就是你自定義的一個(gè)工程名字,也就是你的其中一個(gè)組件或者業(yè)務(wù)模塊


image.png

然后根據(jù)提示,生成pod工程模板


image.png

打開新建的TRUNetworking工程里的Example,可以看到pods里面,有個(gè)ReplaceMe的文件,意思就是要替換它,換成我們自己需要對(duì)外提供的類。
image.png

新建一個(gè)類,比如TRUNetworking,復(fù)制粘貼到ReplaceMe同級(jí)目錄下,并刪掉ReplaceMe.m文件


image.png

之后cd到Lib/TRUNetworking/Example/文件目錄下,執(zhí)行
pod install

這個(gè)時(shí)候在Development Pods文件下會(huì)多出這兩個(gè)文件,這就是本地開發(fā)的pods文件


image.png

而Podfile的內(nèi)容其實(shí)是
pod 'TRUNetworking', :path => '../'
說(shuō)明他獲取的是本地路徑
然后刪除Example for TRUNetworking里面的TRUNetworking類,不然運(yùn)行會(huì)因?yàn)轭愔貜?fù)報(bào)錯(cuò)。
至此,一個(gè)組件的本地庫(kù)就創(chuàng)建完成了。

殼工程使用本地組件庫(kù)

首先cd到殼工程LZDemo目錄下,修改LZDemo的Podfile文件,增加
pod 'TRUNetworking', :path => 'Lib/TRUNetworking'


image.png

執(zhí)行

pod install

這樣殼工程就pod到本地組件庫(kù)的內(nèi)容了,原理跟使用平時(shí)的第三方遠(yuǎn)程庫(kù)一樣。只不過(guò)這次使用的是本地的。只不過(guò)本地的pod放在了Development Pods文件夾里面,這個(gè)文件夾里的內(nèi)容其實(shí)是可以修改的,修改后立刻生效,會(huì)比遠(yuǎn)程pod需要提交版本號(hào),本地再pod對(duì)應(yīng)的版本號(hào)方便得多。

我們?cè)儆猛瑯臃椒▌?chuàng)建另一個(gè)本地工程,登錄模塊TRULogining
但是這個(gè)模塊需要依賴TRUNetworking,所以我們得在兩個(gè)地方添加依賴


image.png

image.png

由于依賴的TRUNetworking在更上一層的文件中,所以需要../../
執(zhí)行

pod install

之后應(yīng)該能看到Development Pods里已經(jīng)有2個(gè)文件夾了


image.png

這個(gè)時(shí)候就可以import里面的類,在本地使用了。

關(guān)聯(lián)git

完成了本地pod依賴,但是我們肯定不會(huì)是個(gè)人開發(fā),否則弄這個(gè)組件化的意義也不大,所以我們首先得提交到遠(yuǎn)程,一般公司里都會(huì)搭建私有倉(cāng)庫(kù)諸如GitLab,這里就拿GitHub來(lái)做演示。

1)提交殼工程到遠(yuǎn)程
首先,在Github上Create a new repository


image.png

然后,cd回殼工程目錄下,依次執(zhí)行

git init

初始化git

git add .

執(zhí)行g(shù)it add .的時(shí)候,會(huì)發(fā)現(xiàn)警告warning: adding embedded git repository: Lib/TRULogining之類的,是因?yàn)門RULogining目錄下有它自己的git倉(cāng)庫(kù),它倆是獨(dú)立存在的,有另外一個(gè)git倉(cāng)庫(kù)專門管理他,因?yàn)樗彩且粋€(gè)完整的獨(dú)立工程,這里我們先忽略它。
然后,提交初始化工程

git commit -m "init project"

接下來(lái),我們要讓這個(gè)工程和剛才在Github上創(chuàng)建的Repository關(guān)聯(lián)

git remote add origin https://github.com/liuzhao/LZDemo.git

然后,提交初始化工程到遠(yuǎn)端的master,這里我們用了-f,表示強(qiáng)制提交,否則因?yàn)镚ithub上還有readme之類的文件,需要解決沖突再pull,比較麻煩,基于是初始工程,直接強(qiáng)制push上去即可。

git push origin master -f

刷新一下Github上的LZDemo,會(huì)看到已經(jīng)提交上去了


image.png

2)提交子工程到遠(yuǎn)端


image.png

使用跟提交主工程一樣的做法,分別在Github上Create a new repository,然后把他們關(guān)聯(lián)起來(lái)
唯一和殼工程不同的是,他們是組件,需要對(duì)外提供依賴關(guān)系。所以我們還得多做一步操作,那就是增加podspec文件。

以TRUNetworking為例,cd到TRUNetworking目錄下,執(zhí)行

git tag 0.1.0
git push --tags

刷新一下Github上的地址,會(huì)看到多了一個(gè)分支


image.png

這個(gè)tag分支就是將來(lái)提供給別人依賴的版本號(hào)分支,有了它,別人使用你的組件的時(shí)候就可以根據(jù)版本號(hào)來(lái)控制了。

接下來(lái),使用trunk方式將代碼發(fā)布到CocoaPods上
首先先編輯一下podspec文件


image.png

改好后,在上傳之前,最好先本地檢查一下podspec是否合法

執(zhí)行下面語(yǔ)句

pod lib lint --verbose
image.png

如果出現(xiàn)passed validation,說(shuō)明通過(guò),可以提交到cocoapods上了
執(zhí)行

pod trunk push TRUNetworking.podspec --verbose

成功后,就可以pod search到我們提交的庫(kù)了
ps:如果搜不到,不是沒傳成功,是我們的本地搜索庫(kù)沒更新,可以先刪除~/Library/Caches/CocoaPods目錄下的search_index.json文件或者pod repo update一下
終端執(zhí)行

rm ~/Library/Caches/CocoaPods/search_index.json

再執(zhí)行

pod search
image.png

這樣,本地庫(kù)就會(huì)變成遠(yuǎn)程庫(kù),我殼工程的podfile文件就可以改成
pod 'TRUNetworking',而不再需要后面的path了


image.png

重新對(duì)殼工程LZDemo進(jìn)行pod install之后,會(huì)發(fā)現(xiàn),原來(lái)的TRUNetworking文件已經(jīng)從Development Pods里跑到Pods里去了


image.png

一些注意點(diǎn):
1)如果pod trunk push上去的podspec文件,如果有依賴庫(kù),這個(gè)依賴庫(kù)必須是在cocoapods上,即使是不能依賴本地庫(kù),而是遠(yuǎn)程庫(kù)。所以說(shuō),比如剛才創(chuàng)建的TRUNetworking和TRULogining,如果要發(fā)布TRULogining到cocoapods,但是由于TRULogining是依賴于TRUNetworking的,所以要首先將TRUNetworking提上到cocoapods上,否則TRULogining是提不上去的。
2)由于殼工程和子工程都有獨(dú)立存在的git,所以別人從殼工程的git地址clone下來(lái)的工程,是沒有子工程的存在的。如果想運(yùn)行起來(lái)殼工程,要么是所有的子工程都已經(jīng)提到cocoapods上,要么是拿到子工程的git地址,checkout到本地殼工程的Lib庫(kù)下。
3)如果你不想每簡(jiǎn)歷一個(gè)子工程,都要到Github或者GitLab上創(chuàng)建一個(gè)repository的話,又想把子工程push到殼工程的git上的話,可以先把子工程里的git刪除,這樣push上的殼工程代碼,就會(huì)帶上子工程了,等你需要單獨(dú)管理子工程的時(shí)候,再把git加回去即可。

小結(jié)

  1. 本文總結(jié)了本地組件上傳到github
  2. 將代碼發(fā)布到Cocoapods

轉(zhuǎn)載自釗de說(shuō)說(shuō)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 項(xiàng)目組件化、平臺(tái)化是技術(shù)公司的共同目標(biāo),越來(lái)越多的技術(shù)公司推崇使用pod管理第三方庫(kù)以及私有組件,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 22,876評(píng)論 0 39
  • 最近在學(xué)習(xí)vue.js的時(shí)候發(fā)現(xiàn),vue的組件化的思想對(duì)于編寫代碼是一個(gè)非常有用的事情。 首先為什么需要組件化? ...
    拂曉的云閱讀 7,361評(píng)論 6 23
  • 要解除循環(huán)依賴,引入包管理技術(shù)cocoapods會(huì)讓我們更有效率。pod不允許組件間有循環(huán)依賴,若有pod ins...
    cs_mark閱讀 2,230評(píng)論 0 1
  • iOS的組件化,一直都是一個(gè)理念,很多大公司一直在強(qiáng)調(diào)卻沒有具體可行的或簡(jiǎn)單可行的方案。所以分享下大概思路。 框架...
    蝴蝶之夢(mèng)天使閱讀 5,484評(píng)論 14 34
  • 一、新建工程LZDemo作為殼工程 1、添加Podfile文件 cd到你剛創(chuàng)建的工程目錄下,執(zhí)行以下語(yǔ)句 然后會(huì)發(fā)...
    MMR無(wú)與倫比閱讀 51,338評(píng)論 30 190

友情鏈接更多精彩內(nèi)容