iOS組件化實(shí)踐

最近在學(xué)習(xí)vue.js的時(shí)候發(fā)現(xiàn),vue的組件化的思想對(duì)于編寫代碼是一個(gè)非常有用的事情。

首先為什么需要組件化?

下面我列舉了一些比較常見(jiàn)的問(wèn)題

  • 業(yè)務(wù)模塊劃分不清楚,各模塊之間耦合度很大片拍,難以維護(hù)
    • 例如我們公司的商城項(xiàng)目隨著功能和時(shí)間,代碼量越來(lái)越大妓肢,早期的一些代碼已經(jīng)不需要了捌省,但是不敢輕易刪除,不敢保證該文件是夠有被使用碉钠。
    • 就算手動(dòng)去查找刪除纲缓,也是一件治標(biāo)不治本的方法卷拘,等過(guò)一段時(shí)間還會(huì)出現(xiàn)這種問(wèn)題
  • 所有模塊代碼都編寫在一個(gè)項(xiàng)目中,測(cè)試某個(gè)模塊或功能的時(shí)候祝高,需要編譯運(yùn)行整個(gè)項(xiàng)目
    • 這一點(diǎn)在做自動(dòng)化測(cè)試的時(shí)候尤其明顯栗弟,如果某個(gè)地方出現(xiàn)問(wèn)題,現(xiàn)在就無(wú)法再繼續(xù)進(jìn)行測(cè)試了
  • 復(fù)用性不好工闺,需要經(jīng)常造輪子
    • 在我們的項(xiàng)目中乍赫,如果之前的開(kāi)發(fā)人員離職了,那么他造過(guò)哪些輪子陆蟆,經(jīng)常后續(xù)的開(kāi)發(fā)人員是不了解不清楚的雷厂。
    • 如果又需要做一些類似的功能,新的開(kāi)發(fā)人員有需要重復(fù)造輪子
  • 開(kāi)發(fā)效率很低叠殷,分工不明確
    • 如果有新人加入項(xiàng)目改鲫,不能保證可以立刻投入開(kāi)發(fā)。需要較長(zhǎng)的時(shí)間來(lái)熟悉代碼林束,且新人在熟悉代碼的過(guò)程也容易走彎路像棘。

組件化解決問(wèn)題的思路

利用中間層來(lái)做到:只讓別的模塊對(duì)中間層產(chǎn)生耦合,中間層不對(duì)其他模塊產(chǎn)生耦合
關(guān)于這個(gè)中間層壶冒,這個(gè)問(wèn)題在這里我們就不深究了缕题,大家可以參考蘑菇街解決思路

組件化的目的

我們可以講每一個(gè)模塊作為一個(gè)組件胖腾。并且建立一個(gè)主項(xiàng)目避除,這個(gè)朱羨慕負(fù)責(zé)集成所有組件。
好處:

  • 業(yè)務(wù)劃分清晰胸嘁,新人接受項(xiàng)目容易,不同的組件是不同的開(kāi)發(fā)任務(wù)凉逛,大組件下的小組件是一個(gè)小的開(kāi)發(fā)任務(wù)
  • 項(xiàng)目維護(hù)性更強(qiáng)性宏,需要什么功能,很好找到状飞,提高了開(kāi)發(fā)的銷量毫胜。
  • 能夠更好的發(fā)現(xiàn)問(wèn)題并找到問(wèn)題,當(dāng)某個(gè)地方出現(xiàn)問(wèn)題了诬辈,可以直接對(duì)該組件進(jìn)行處理酵使,處理好了更新組件就好。
  • 開(kāi)發(fā)和測(cè)試的時(shí)候焙糟,可以只編譯自己寫的代碼口渔,不需要編譯全部項(xiàng)目。測(cè)試人員也可以測(cè)試單個(gè)組件穿撮。

在這里需要解釋一下什么是組件缺脉?

一個(gè)分類可以是一個(gè)組件痪欲,一個(gè)輪播圖也可以是一個(gè)組件,一個(gè)Controller也是一個(gè)組件攻礼,甚至一個(gè)首頁(yè)模塊(包含內(nèi)部的所有Controller和業(yè)務(wù))业踢,都可以是一個(gè)組件。

像分類這種被稱為基礎(chǔ)組件礁扮,輪播圖這種被稱為UI組件知举,Controller和首頁(yè)模塊這種被稱為業(yè)務(wù)組件。從前到后太伊,從簡(jiǎn)單到復(fù)雜雇锡,都是組件。

我們應(yīng)該怎么做倦畅?

在組件化的架構(gòu)中遮糖,有一個(gè)主項(xiàng)目用來(lái)負(fù)責(zé)集成其余組件。每一個(gè)組件又是一個(gè)單獨(dú)的工程叠赐。

組件只需要對(duì)外提供服務(wù)芭概,通過(guò)中間件來(lái)調(diào)用這些服務(wù)。

在這里將通過(guò)iOScocoapods私有庫(kù)的形式來(lái)完成一個(gè)組件化的示例罢洲。

cocoapodsAFNetworking為例惹苗。

Jietu20190222-102245.jpg

當(dāng)我們使用pod search AFNetworking的時(shí)候殿较,就是去cocoapodsSpecs索引中找到AFNetworking的配置信息桩蓉,然后通過(guò)這個(gè)配置信息院究,配置信息包含的在github上的代碼地址业汰,去獲得對(duì)應(yīng)的代碼样漆。

現(xiàn)在我們要做的就是按照cocoapods官方的這一套來(lái)生成我們自己的一套,我們自己生成一個(gè)非官方的Specs索引鹅髓,在這個(gè)索引里只存放公司的庫(kù)索引窿冯,也就是一個(gè)個(gè)組件,這些組件的具體地址鄙皇,放到我們想放到的地址下面伴逸。如coding私有庫(kù)错蝴,碼云顷锰,公司部署的gitlab等官紫。

簡(jiǎn)單的來(lái)說(shuō)就是仿照上圖的這三個(gè)東西束世。

準(zhǔn)備工作

本地的cocoapods必須要安裝好沉帮,如何安裝cocoapods,這里就不寫了

成員劃分

組件化主要負(fù)責(zé)人:負(fù)責(zé)建立最基本的Spec索引严嗜,搭建宿主項(xiàng)目漫玄,合并業(yè)務(wù)組件到宿主工程(理想狀況下)
團(tuán)隊(duì)開(kāi)發(fā)者:編寫組件渗常,更新組件皱碘。

詳細(xì)步驟

  1. 編寫組件代碼癌椿,比如一個(gè)輪播圖,一個(gè)數(shù)據(jù)庫(kù)工具等都办,具體寫代碼的過(guò)程就不說(shuō)了琳钉,這里我使用小碼哥的代碼來(lái)做示范,因?yàn)檫@個(gè)實(shí)踐的文檔也是基于一位講師的文章來(lái)做的歼培。

    下面是編寫好的代碼躲庄,在這里分了兩個(gè)模塊,一個(gè)是Base倔监,一個(gè)是Category浩习。這兩個(gè)模塊不依賴于任何別的第三方文件和庫(kù)洽蛀。

    Image Copied on 2019-02-21 at 15.15.35 PM.png
  1. 建立自己的Spec索引郊供,這里我們建立在碼云上,因?yàn)榇a云免費(fèi)且沒(méi)有項(xiàng)目個(gè)數(shù)的限制头岔。在這里我的Spec項(xiàng)目名為LJDemoSpecs峡竣,這里我沒(méi)有添加ReadMe.gitignore文件,因此會(huì)提示添加readme和lisence类浪。
    f9140582-fd88-4190-8e4b-e2478856ab3b.png.jpeg

現(xiàn)在我們將整個(gè)建立的podSpecs添加到我們本地的pod索引中,這里會(huì)驗(yàn)證一下用戶名和密碼力细。

0a1f9c5c-5f3b-4aba-ae08-12a5cde8d615.png

現(xiàn)在前往電腦中的個(gè)人下的.cocoapods文件夾,可以看到repos下面有兩個(gè)文件夾逝慧,一個(gè)是master笛臣,一個(gè)是LJDemoSpecs

4c10983e-0049-4725-b6c6-2d717ee01cca.png

mastercocoapods的官方索引庫(kù)踱蛀,而LJDemoSpecs是剛才我們建立的私人的索引庫(kù),現(xiàn)在里面還什么都沒(méi)有猬膨。

這里想要查看.cocoapods文件夾需要開(kāi)啟顯示隱藏文件的權(quán)限

  1. 現(xiàn)在利用pod來(lái)生成一個(gè)組件化的項(xiàng)目,這個(gè)項(xiàng)目的名字叫做LJDemoBase沛申。

    這里不通過(guò)xcode來(lái)建立project铁材,而是使用pod命令來(lái)直接生成組件化的項(xiàng)目。

    這里的命令就是pod lib create LJDemoBase饼丘,它會(huì)從cocoapods的模板中給你clone一個(gè)項(xiàng)目。

    • 詢問(wèn)你使用的語(yǔ)言
    • 是否需要demo工程
    • 是否使用測(cè)試framework
    • 是否基于View測(cè)試
    • 類的前綴

    輸入完畢后稍等片刻贴捡,xcode會(huì)自動(dòng)打開(kāi)這個(gè)項(xiàng)目,我把全部的命令貼一下

    ac80d2ec-62d0-4d88-84b1-10ba5f1c37c9.png

  1. 下面是自動(dòng)生成的pod項(xiàng)目的目錄結(jié)構(gòu)
    • Example主要存放對(duì)應(yīng)的demo
    • LJDemoBase主要存放代碼和需要的資源
    • podspec文件則是記錄著當(dāng)前組件的相關(guān)信息汛骂,包括git地址,對(duì)應(yīng)的描述蝶念,需要依賴的庫(kù)等等担敌。
    • 右側(cè)的信息不用填寫全封,后面再填寫
      89386329-6665-49aa-b982-38e867140538.png
  1. 現(xiàn)在把第一步中的代碼添加到這個(gè)pod項(xiàng)目中,添加代碼的方法有好幾種土匀,這里我僅僅寫我使用的方法。
    1. 在對(duì)應(yīng)的Example中編寫調(diào)試代碼钓丰,編寫完成后如下圖所示
1a910a84-7623-46e1-bda3-ad44fb53d00e.png
  1. 代碼已經(jīng)寫完了,也調(diào)試好了∶渭現(xiàn)在將對(duì)應(yīng)的代碼放到LJDemoBase下的Classes文件夾下,將Classes下已有的Relpace文件刪除存筏。

    這里我們直接在finder里操作椭坚,不是在Exampleworkspace操作。

    08eb10e5-ab9c-4828-8252-1c8808798d53.png

  1. 現(xiàn)在刪除Example項(xiàng)目中的的BaseCategory烁焙,然后在Example目錄下使用命令pod install考阱。對(duì)應(yīng)的結(jié)果如下
    7d573656-0777-4390-aa74-362c33fd0307.png.jpeg
  1. 再次查看LJDemoBase.xcworkspace,可以看到對(duì)應(yīng)的代碼已經(jīng)自動(dòng)被放到Development Pods下面了。
    7818a553-4aef-4424-99de-b7bf342799dc.png
  1. 現(xiàn)在如果這就是我們這個(gè)小組件的第一個(gè)版本跨细,當(dāng)前代碼只是寫在本地,需要將他放到遠(yuǎn)程倉(cāng)庫(kù)上散休。我們?cè)?code>gitoschina建立一個(gè)對(duì)應(yīng)的倉(cāng)庫(kù)。

    建立好以后如下圖所示:


    1435f846-56dd-4c6b-b45f-e02b9d1c0f31.png

這里任然不添加ReadMe.gitignore文件,因?yàn)?code>pod lib create創(chuàng)建的項(xiàng)目里已經(jīng)有這兩個(gè)文件了

  1. 代碼雖然已經(jīng)寫完了胁勺,但是對(duì)應(yīng)的配置信息卻一點(diǎn)都沒(méi)有寫,現(xiàn)在來(lái)把配置信息補(bǔ)齊蛇捌。
Pod::Spec.new do |s|
  s.name             = 'LJDemoBase'                         #名稱
  s.version          = '0.1.0'                              #版本號(hào)
  s.summary          = 'A short description of LJDemoBase.' #簡(jiǎn)短介紹,下面是詳細(xì)介紹

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC
  #主頁(yè),這里要填寫可以訪問(wèn)到的地址春贸,不然驗(yàn)證不通過(guò)
  s.homepage         = 'https://gitee.com/lj360691676/LJDemoBase'
  #截圖
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  #開(kāi)源協(xié)議
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  
  #作者信息
  s.author           = { 'liangjian' => '360691676@qq.com' }
  #項(xiàng)目地址逸嘀,這里不支持ssh的地址,驗(yàn)證不通過(guò)司光,只支持HTTP和HTTPS,最好使用HTTPS
  s.source           = { :git => 'https://gitee.com/lj360691676/LJDemoBase.git', :tag => s.version.to_s }
  
  #多媒體介紹地址
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  #支持的平臺(tái)及版本
  s.ios.deployment_target = '8.0'

  #代碼源文件地址坞淮,**/*表示Classes目錄及其子目錄下所有文件,如果有多個(gè)目錄下則用逗號(hào)分開(kāi)毫玖,如果需要在項(xiàng)目中分組顯示,這里也要做相應(yīng)的設(shè)置
  s.source_files = 'LJDemoBase/Classes/**/*'
  
  
  #資源文件地址
  # s.resource_bundles = {
  #   'LJDemoBase' => ['LJDemoBase/Assets/*.png']
  # }

  #公開(kāi)頭文件地址
  # s.public_header_files = 'Pod/Classes/**/*.h'
  
  #所需的framework阐滩,多個(gè)用逗號(hào)隔開(kāi)
  # s.frameworks = 'UIKit', 'MapKit'
  
  #依賴關(guān)系,該項(xiàng)目所依賴的其他庫(kù)装获,如果有多個(gè)需要填寫多個(gè)s.dependency
  # s.dependency 'AFNetworking', '~> 2.3'
end

在上面已經(jīng)將對(duì)應(yīng)的參數(shù)通過(guò)備注的形式解釋了,下面我貼一下我這個(gè)組件的podspec的截圖精肃,劃線部分是修改過(guò)的地方筐眷。

4e6070de-aba3-4fa0-bbf8-c5e042b8c238.png

由于不要依賴第三方庫(kù)和別的資源文件,因此s.dependencys.resource_bundles都沒(méi)有打開(kāi)注釋武翎。

  1. 現(xiàn)在本地LJDemoBase代碼和對(duì)應(yīng)LJDemoBasepodspec都搞好了梳庆,LJDemoBase的遠(yuǎn)程倉(cāng)庫(kù)也建立好了驻售,現(xiàn)在把本地和遠(yuǎn)程的庫(kù)關(guān)聯(lián)起來(lái)。

    下面的操作基于LJDemoBase主文件夾:

    da93e30d-82ca-4fcb-98b1-47ee4be76bfc.png

  1. 做完上面的這些操作迟几,再來(lái)看oschina上的對(duì)應(yīng)倉(cāng)庫(kù),對(duì)應(yīng)的內(nèi)容已經(jīng)全部同步了

    a696054c-f7e0-46b9-8a58-268ce669b13e.png

現(xiàn)在本地和遠(yuǎn)程倉(cāng)庫(kù)已經(jīng)關(guān)聯(lián)了

  1. 在我們使用cocoapods的過(guò)程中,常常會(huì)發(fā)現(xiàn)當(dāng)搜索某個(gè)庫(kù)的時(shí)候會(huì)有對(duì)應(yīng)的Version,可以使用指定版本的代碼來(lái)集成到項(xiàng)目中,如下圖所示

    -> AFNetworking (3.1.0)
    A delightful iOS and OS X networking framework.
    pod 'AFNetworking', '~> 3.1.0'
    - Homepage: https://github.com/AFNetworking/AFNetworking
    - Source:   https://github.com/AFNetworking/AFNetworking.git
    - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1,
    2.6.0, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0,
    2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0,
    1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
    - Subspecs:
      - AFNetworking/Serialization (3.1.0)
      - AFNetworking/Security (3.1.0)
      - AFNetworking/Reachability (3.1.0)
      - AFNetworking/NSURLSession (3.1.0)
      - AFNetworking/UIKit (3.1.0)
    

    Version對(duì)應(yīng)相關(guān)版本的代碼,通過(guò)git tag的形式來(lái)做到區(qū)分版本嵌施。

    下面我們也給當(dāng)前的代碼制定一下版本吃靠,命令非常簡(jiǎn)單,如下所示就是打了個(gè)0.1.0的tag

    93f0543c-982a-443b-8fc8-22e62feeef8f.png

查看遠(yuǎn)程倉(cāng)庫(kù)族奢,可以看到這就是剛才的tag

3109828a-2bd9-4d74-9fe4-6868788cdf3b.png

  1. 現(xiàn)在一切準(zhǔn)備就緒靠欢,需要將我們寫的這個(gè)組件的配置信息加入到私有的pod索引里去门怪,也就是第二步中那個(gè)Spec索引肋殴。
    還是在當(dāng)前打tag的目錄執(zhí)行下面的命令
    93961340-0612-4b04-a2e4-32103ad796a3.png

下面來(lái)看看本地和遠(yuǎn)程的索引庫(kù),發(fā)現(xiàn)現(xiàn)在都有啦

上面的命令會(huì)自動(dòng)幫我們同步到本地和遠(yuǎn)程

cf891fb1-cfae-41f2-b592-d5edef7b531e.png
3e73c812-3439-4219-b286-abcc0f22c58f.png
  1. 下面來(lái)檢索這個(gè)LJDemoBase拧粪,可以看到下面的可霎。
    8e1cfa1d-8414-46b7-8f8e-b19eda899347.png

發(fā)現(xiàn)搜索不到,這是緩存的問(wèn)題

  輸入`rm ~/Library/Caches/CocoaPods/search_index.json`然后重新搜索
  1. 現(xiàn)在通過(guò)xcode建立主工程LJDemoProject绢记,建立好項(xiàng)目之后使用pod初始化后如圖
    fabbe9ba-4504-4436-8ae0-eb48ec6168fd.png
  1. 打開(kāi)LJDemoProject.xcworkspace跪解,編輯Podfile文件签孔,添加source

    添加source的目的:默認(rèn)情況下cocoapods指定使用官方的索引叉讥,這里我們不僅要使用官方,也要使用個(gè)人私有的索引

    修改后的文件內(nèi)容如下:


    3fab3438-e326-4e98-a55c-ba683348b38a.png

至于怎么看source的地址饥追,使用下列命令pod repo

      liangdeiMac:LJDemoBase apple$ pod repo
      LJDemoSpecs
      - Type: git (master)
      - URL:  https://gitee.com/lj360691676/LJDemoSpecs.git
      - Path: /Users/devliang/.cocoapods/repos/LJDemoSpecs
      master
      - Type: git (master)
      - URL:  https://github.com/CocoaPods/Specs.git
      - Path: /Users/apple/.cocoapods/repos/master
      2 repos
  1. 現(xiàn)在在Podfile文件的的父目錄下pod insatll
    打開(kāi)LJDemoProject.xcworkspace會(huì)看到如下圖所示图仓,這樣我們的組件就被集成進(jìn)項(xiàng)目里了

    da2cd47c-0413-4e8c-8d8d-e390c90fc98e.png

到這里我們制作集成組件就講的差不多了但绕,下面是補(bǔ)充一些相關(guān)的東西

  • 如何細(xì)分組件救崔,給組件劃分模塊
  • 如何給組件添加依賴
  • 如何更新組件
  • 如何給組件添加資源文件
  • 多人協(xié)作開(kāi)發(fā)時(shí),如何做到組件化開(kāi)發(fā)

細(xì)分組件

在組件的開(kāi)發(fā)過(guò)程中捏顺,常常會(huì)對(duì)組件進(jìn)行結(jié)構(gòu)劃分六孵,例如上面的組件劃分為BaseCategory,雖然在物理文件夾上將這兩個(gè)模塊的代碼分開(kāi)了草丧。但是在使用代碼的過(guò)程中卻并沒(méi)有分開(kāi)狸臣,就像15步的最后那張圖莹桅,這兩部分的代碼最后被一起放到了LJDemoBae下昌执。

其實(shí)在使用cocoapods的過(guò)程中,會(huì)發(fā)現(xiàn)有一個(gè)Subspecs字段诈泼,這就是對(duì)應(yīng)的組件細(xì)分懂拾,如下面的AFNetworking所示。

-> AFNetworking (3.1.0)
      A delightful iOS and OS X networking framework.
      pod 'AFNetworking', '~> 3.1.0'
      - Homepage: https://github.com/AFNetworking/AFNetworking
      - Source:   https://github.com/AFNetworking/AFNetworking.git
      - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1,
      2.6.0, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0,
      2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0,
      1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
      - Subspecs:
        - AFNetworking/Serialization (3.1.0)
        - AFNetworking/Security (3.1.0)
        - AFNetworking/Reachability (3.1.0)
        - AFNetworking/NSURLSession (3.1.0)
        - AFNetworking/UIKit (3.1.0)

下面要做到導(dǎo)入組件的時(shí)候會(huì)自動(dòng)將已經(jīng)劃分好的目錄結(jié)構(gòu)導(dǎo)入铐达,并且還能夠按需導(dǎo)入岖赋,比如說(shuō)我只需要Base那么可以只導(dǎo)入該組件下的Base,而不會(huì)將其他文件導(dǎo)入瓮孙。

其實(shí)文件的目錄劃分在上面已經(jīng)做好了(這里我是之前劃分好了唐断,你如果沒(méi)劃分是要?jiǎng)澐值模F(xiàn)在這里只需要配置一下Specs就可以了杭抠。

  1. 如下圖所示脸甘,修改的地方我都已經(jīng)標(biāo)注好了


    4b0e8f98-3321-4ff8-84a2-158451dd008c.png
  1. 現(xiàn)在提交新的代碼,提交代碼加打tag都放在下面了
    3cf502d8-7a99-4b45-ae1c-f7272e15815c.png

    41c1b201-48a4-4d33-bb9b-04c3f807ef1c.png

    53daf856-0c48-46cc-9150-26bb4e8e5b6b.png
  1. 更新spec索引pod repo push LJDemoSpecs LJDemoBase.podspec偏灿。
    538f1bcb-71e8-41d1-bb4e-bf0491d2d2a2.png
  1. 搜索組件pod search ljdemobase丹诀,如下圖所示,現(xiàn)在的Versions有0.1.0和0.2.0,且SubspecsBaseCategory了铆遭。
    754693ea-1026-449e-b93c-dfb2d65dde89.png
  1. 現(xiàn)在更新一下LJDemoProject項(xiàng)目中使用到的組件硝桩,pod update --no-repo-update,至于為什么要加后面的參數(shù)是因?yàn)椴蝗绮患拥脑挄?huì)更新pod官方索引枚荣,需要的時(shí)間比較長(zhǎng)碗脊,我們不想更新官方的索引。
    869cf4a6-fd9e-4fd3-800d-d45123a0a4b3.png
  1. 現(xiàn)在再看一下項(xiàng)目中用到的這個(gè)組件棍弄,發(fā)現(xiàn)現(xiàn)在對(duì)應(yīng)的目錄結(jié)構(gòu)已經(jīng)分好了望薄。
5e7e4d4a-eba5-4f35-b81a-60e2baa49669.png

如果現(xiàn)在只想使用組件中的一個(gè)子組件,那么在Podfile中可以寫作如下所示

ae28daa0-cff9-4ab8-a8b2-d585e61e1c45.png

修改完畢以后再使用pod update --no-repo-update重新安裝一下依賴組件即可

如何給組件添加依賴

在制作組件的過(guò)程中呼畸,常常需要依賴一些第三方的框架痕支,常見(jiàn)的如AFNetworkingSDWebimage等,下面講解一下如何添加依賴蛮原。

  • 添加依賴的是公開(kāi)的代碼卧须,如AFNetworking
    1. 添加的配置信息是寫在組件的podspec文件里,很簡(jiǎn)單如下所示
      560b5a9c-fd4d-4e05-a754-af97530ff052.png
  1. 更新到遠(yuǎn)程倉(cāng)庫(kù)儒陨,打tag并更新Spec索引
    0013c54a-1190-4317-9b1a-421d986bf407.png
  1. 在項(xiàng)目中使用新版本的組件花嘶,下面的命令是在LJDemoProject項(xiàng)目下
    385f10c1-a6c7-46f5-9c10-50cff508f10c.png

執(zhí)行完上面的命令,現(xiàn)在來(lái)看一下項(xiàng)目中的依賴庫(kù)


ddb2a5f8-8c47-437d-b4e8-2d5c3925ba91.png
  1. 如果需要給某個(gè)組件的子組件添加依賴庫(kù)蹦漠,那么podspec文件寫作如下所示

    這里我只截圖了兩部分的內(nèi)容椭员,上圖為代碼添加,下圖為spec的修改


    313c5f8e-9e65-4278-ac8e-4cb2a03abe10.png

    Image Copied on 2019-02-21 at 18.01.52 PM.png
  1. 上面的工作都做完以后笛园,現(xiàn)在執(zhí)行我們的更新組件三部曲
    • 推送組件代碼到遠(yuǎn)程隘击,打tag,這里我直接貼圖了,下面的命令在上面的講解中我已經(jīng)講過(guò)很多次了

      927f5c17-e215-46d0-b7fd-c6189fa2ccdc.png
  • 更新spec索引pod repo push LJDemoSpecs LJDemoBase.podspec研铆。
108255de-85a5-41da-afad-21818e8f2c65.png
  • 先修改LJDemoProject項(xiàng)目中的Podfile埋同。

    這里分兩種,一種子組件不依賴第三方棵红,一種的子組件依賴第三方

    • 不依賴第三方凶赁,pod 'LJDemoBase/Category'
    • 依賴第三方,pod ‘LJDemoBase’, :subspaces =>[‘Category’, ‘Network’]

    在項(xiàng)目中使用新版本的組件逆甜,下面的命令是在LJDemoProject項(xiàng)目下

    5e16ea7c-a5c1-4e16-9df4-e6840281a827.png
  • 子組件不依賴第三方

    f39b9ea6-2cd9-4ccb-a28c-bc87fef11082.png
  • 子組件依賴第三方


    5318c5d9-af9c-4724-aa75-e22d8d500eea.png

可以很清晰的看到虱肄,子組件如果依賴第三方庫(kù),當(dāng)使用子組件的時(shí)候會(huì)自動(dòng)幫我們安裝依賴的三方庫(kù)交煞,而如果沒(méi)有使用依賴三方庫(kù)的子組件咏窿,并不會(huì)安裝對(duì)應(yīng)的第三方庫(kù)

  • 添加依賴的是私有庫(kù),比如前面寫了個(gè)LJDemoBase错敢,現(xiàn)在又要?jiǎng)?chuàng)建一個(gè)新的組件叫LJDemoView翰灾,它依賴于LJDemoBase
    先創(chuàng)建對(duì)應(yīng)的pod lib
    21ce98c2-58ba-4a33-a243-ca68e4e7af05.png
  1. LJDemoViewPodfile中添加對(duì)應(yīng)的私有pod索引缕粹,如下圖所示

    看清楚,這里是LJDemoViewPodfile

    69e1c212-a13e-4425-9b8b-826a69e293e0.png

  1. LJDemoViewLJDemoView.podspec下添加依賴纸淮,下圖中不僅添加了依賴平斩,描述,git地址等配置信息都填好了(因?yàn)檫@是一個(gè)新的組件)
    19209d8a-1008-41e1-82ee-44e62e7f67cb.png
  1. 推送代碼到遠(yuǎn)程倉(cāng)庫(kù)咽块,打tag并更新Spec索引绘面,下面我只貼命令了,相信大家已經(jīng)知道用什么命令了(前面敲了n次)
    liangdeiMac:LJDemoView apple$ git add .
    liangdeiMac:LJDemoView apple$ git commit -m"initial LJDemoView with first version"
    liangdeiMac:LJDemoView apple$ git remote add origin https://gitee.com/lj360691676/LJDemoView.git
    liangdeiMac:LJDemoView apple$ git push origin master
    liangdeiMac:LJDemoView apple$ git tag
    liangdeiMac:LJDemoView apple$ git tag 0.1.0
    liangdeiMac:LJDemoView apple$ git push --tags
    liangdeiMac:LJDemoView apple$ pod repo push LJDemoSpecs LJDemoView.podspec --allow-warnings
    
  2. LJDemoProject下的Podfile中添加新的組件侈沪,這里為了區(qū)別之前的LJDemoBase組件揭璃,把之前的組件注釋掉
    3e247d93-39e2-4b4c-aff4-07092cf820f6.png

重新安裝組件

   liangdeiMac:LJDemoView apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject
   liangdeiMac:LJDemoProject apple$  pod update --no-repo-update

重新安裝后的項(xiàng)目pod依賴如下


cfdc7389-4c90-4383-a4e9-6ca888bf75b6.png

組件直接的相互依賴就說(shuō)到這里,如果還有問(wèn)題可以參看下面的官方文檔的介紹

https://guides.cocoapods.org/syntax/podspec.html

如何更新組件

  1. 添加對(duì)應(yīng)的代碼亭罪,修改podspec文件瘦馍,推送到遠(yuǎn)程

  2. tag并推送tag

  3. 更新spec索引,如pod repo push LJDemoSpecs LJDemoBase.podspec

  4. 使用組件应役,在項(xiàng)目的Podfile中添加

    我這里只是寫的大體步驟情组,具體步驟上面做了很多次了,相信都已經(jīng)很了解了

如何給組件添加資源文件

在開(kāi)發(fā)組件的過(guò)程中箩祥,常常需要用到一些資源文件院崇,常見(jiàn)的如圖片,xib等袍祖。

這里我就不花大篇幅來(lái)講了底瓣,大家可以看這個(gè)老師寫的添加組件資源的博客

教你如何從0到1實(shí)現(xiàn)組件化架構(gòu)

多人協(xié)作開(kāi)發(fā)時(shí),如何做到組件化開(kāi)發(fā)

經(jīng)過(guò)上面的講解蕉陋,相信大家應(yīng)該知道怎么來(lái)制作更新一個(gè)組件了捐凭,但是上面的一切都是基于個(gè)人的操作,如何在團(tuán)隊(duì)中能夠開(kāi)發(fā)并使用是接下來(lái)討論的問(wèn)題寺滚。

這里我是基于oschina建立了一個(gè)組織柑营,組織里就是公司的同事屈雄。

完成后的組織結(jié)構(gòu)如下圖所示


Image Copied on 2019-02-21 at 19.22.17 PM.png

重要:下面的操作是在另一位同事的電腦上村视,這個(gè)同事叫MT

  1. LJDemoSpecs的內(nèi)容clone到本地。

    這里的本地地址為:前往電腦中的個(gè)人下的.cocoapods文件夾酒奶,可以看到repos下面有一個(gè)文件夾master蚁孔,master里存放的官方的庫(kù)索引,我們現(xiàn)在要加入組織的私有庫(kù)索引LJDemoSpecs惋嚎。

    下面我貼下命令

    
    MTdeiMac:~ apple$ cd /Users/apple/.cocoapods/repos
    MTdeiMac:repos apple$ git clone https://gitee.com/j1-iOS/ljdemospecs.git
    

    做完上面的操作杠氢,如下圖所示

    3eaaaf74-c232-4147-a0ab-b9bccc989cac.png

現(xiàn)在通過(guò)pod repo可以看到有兩個(gè)庫(kù)索引,如下圖

fa39137a-9ef4-4f41-b8e0-a7e16bdf4a9e.png

  1. 現(xiàn)在可以把放在oschina上的組件和項(xiàng)目都clone下來(lái)另伍,然后和文章前面所講的一樣來(lái)進(jìn)行組件的開(kāi)發(fā)和項(xiàng)目的開(kāi)發(fā)了鼻百。

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笆环,更是在濱河造成了極大的恐慌像吻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺爱,死亡現(xiàn)場(chǎng)離奇詭異晃琳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)琐鲁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門卫旱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人围段,你說(shuō)我怎么就攤上這事顾翼。” “怎么了奈泪?”我有些...
    開(kāi)封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵暴构,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我段磨,道長(zhǎng)取逾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任苹支,我火速辦了婚禮砾隅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘债蜜。我一直安慰自己晴埂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布寻定。 她就那樣靜靜地躺著儒洛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狼速。 梳的紋絲不亂的頭發(fā)上琅锻,一...
    開(kāi)封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音向胡,去河邊找鬼恼蓬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛僵芹,可吹牛的內(nèi)容都是我干的处硬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拇派,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荷辕!你這毒婦竟也來(lái)了凿跳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疮方,失蹤者是張志新(化名)和其女友劉穎拄显,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體案站,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躬审,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟆盐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片承边。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖石挂,靈堂內(nèi)的尸體忽然破棺而出博助,到底是詐尸還是另有隱情,我是刑警寧澤痹愚,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布富岳,位于F島的核電站,受9級(jí)特大地震影響拯腮,放射性物質(zhì)發(fā)生泄漏窖式。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一动壤、第九天 我趴在偏房一處隱蔽的房頂上張望萝喘。 院中可真熱鬧,春花似錦琼懊、人聲如沸阁簸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)启妹。三九已至,卻和暖如春醉旦,著一層夾襖步出監(jiān)牢的瞬間饶米,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工髓抑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咙崎,地道東北人优幸。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓吨拍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親网杆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羹饰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348