iOS組件化-私有podSpecs

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

首先為什么需要組件化?

下面我列舉了一些比較常見的問題

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

組件化解決問題的思路

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

組件化的目的

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

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

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

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

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

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

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

組件只需要對外提供服務(wù),通過中間件來調(diào)用這些服務(wù)。

在這里將通過iOScocoapods私有庫的形式來完成一個(gè)組件化的示例。

cocoapodsAFNetworking為例。

[cocoapods的Specs索引]-->(AFNetworking的配置信息)-->C(AFNetworking的具體代碼)

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

現(xiàn)在我們要做的就是按照cocoapods官方的這一套來生成我們自己的一套,我們自己生成一個(gè)非官方的Specs索引,在這個(gè)索引里只存放公司的庫索引,也就是一個(gè)個(gè)組件,這些組件的具體地址,放到我們想放到的地址下面。如coding私有庫,碼云,公司部署的gitlab等。

簡單的來說就是仿照上圖的這三個(gè)東西。

準(zhǔn)備工作

本地的cocoapods必須要安裝好,這里有篇文章寫得很好,我就不復(fù)述了。文章地址:如何安裝cocoapods

詳細(xì)步驟

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

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

  1. 建立自己的Spec索引,這里我們建立在碼云上,因?yàn)榇a云免費(fèi)且沒有項(xiàng)目個(gè)數(shù)的限制。在這里我的Spec項(xiàng)目名為LJDemoSpecs,這里我沒有添加ReadMe.gitignore文件。

    image
    image

    這里會驗(yàn)證一下用戶名和密碼,報(bào)錯(cuò)的原因是由于鑰匙串中存儲著多個(gè)oschina的用戶名和密碼,刪掉不用的那個(gè)就行了。

    liangdeiMac:~ apple$ pod repo add LJDemoSpecs https://git.oschina.net/dev_liang152/ljdemospecs.git
    Cloning spec repo `LJDemoSpecs` from `https://git.oschina.net/dev_liang152/ljdemospecs.git`
    [!] /usr/bin/git clone https://git.oschina.net/dev_liang152/ljdemospecs.git LJDemoSpecs
    
    Cloning into 'LJDemoSpecs'...
    fatal: Authentication failed for 'https://git.oschina.net/dev_liang152/ljdemospecs.git/'
    
    liangdeiMac:~ apple$ pod repo add LJDemoSpecs https://git.oschina.net/dev_liang152/ljdemospecs.git
    Cloning spec repo `LJDemoSpecs` from `https://git.oschina.net/dev_liang152/ljdemospecs.git`
    Username for 'https://git.oschina.net': 152XXXXXX@163.com
    Password for 'https://152XXXXXX@163.com@git.oschina.net':
    

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

    mastercocoapods的官方索引庫,而LJDemoSpecs是剛才我們建立的私人的索引庫,現(xiàn)在里面還什么都沒有。

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

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

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

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

    • 詢問你使用的語言
    • 是否需要demo工程
    • 是否使用測試framework
    • 是否基于View測試
    • 類的前綴

    輸入完畢后稍等片刻,xcode會自動打開這個(gè)項(xiàng)目

    liangdeiMac:~ apple$ cd /Users/apple/Documents/LJDemo 
    liangdeiMac:LJDemo apple$ pod lib create LJDemoBase
    Cloning `https://github.com/CocoaPods/pod-template.git` into `LJDemoBase`.
    Configuring LJDemoBase template
    ------------------------------
    To get you started we need to ask a few questions, this should only take a minute.
    If this is your first time we recommend running through with the guide: 
     - http://guides.cocoapods.org/making/using-pod-lib-create.html
     ( hold cmd and double click links to open in a browser. )
    What language do you want to use?? [ Swift / ObjC ]
     > objc
    
    Would you like to include a demo application with your library? [ Yes / No ]
     > yes
    
    Which testing frameworks will you use? [ Specta / Kiwi / None ]
     > none
    
    Would you like to do view based testing? [ Yes / No ]
     > no
    
    What is your class prefix?
     > LJ
    
    Running pod install on your new library.
    
    Analyzing dependencies
    Fetching podspec for `LJDemoBase` from `../`
    Downloading dependencies
    Installing LJDemoBase (0.1.0)
    Generating Pods project
    Integrating client project
    
    [!] Please close any current Xcode sessions and use `LJDemoBase.xcworkspace` for this project from now on.
    Sending stats
    Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
    
     Ace! you're ready to go!
     We will start you off by opening your project in Xcode
      open 'LJDemoBase/Example/LJDemoBase.xcworkspace'
    
    To learn more about the template see `https://github.com/CocoaPods/pod-template.git`.
    To learn more about creating a new pod, see `http://guides.cocoapods.org/making/making-a-cocoapod`.
    
  3. 下面是自動生成的pod項(xiàng)目的目錄結(jié)構(gòu)

    • Example主要存放對應(yīng)的demo
    • LJDemoBase主要存放代碼和需要的資源
    • podspec文件則是記錄著當(dāng)前組件的相關(guān)信息,包括git地址,對應(yīng)的描述,需要依賴的庫等等
  4. 現(xiàn)在把第一步中的代碼添加到這個(gè)pod項(xiàng)目中,添加代碼的方法有好幾種,這里我僅僅寫我使用的方法。

    1. 在對應(yīng)的Example中編寫調(diào)試代碼,編寫完成后如下圖所示

    2. 代碼已經(jīng)寫完了,也調(diào)試好了。現(xiàn)在將對應(yīng)的代碼放到LJDemoBase下的Classes文件夾下,將Classes下已有的Relpace文件刪除。

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

    3. 現(xiàn)在刪除Example項(xiàng)目中的的BaseCategory,然后在Example目錄下使用命令pod install。對應(yīng)的結(jié)果如下

      liangdeiMac:Example apple$ pod install
      Analyzing dependencies
      Fetching podspec for `LJDemoBase` from `../`
      Downloading dependencies
      Using LJDemoBase (0.1.0)
      Generating Pods project
      Integrating client project
      Sending stats
      Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
      
    4. 再次查看LJDemoBase.xcworkspace,可以看到對應(yīng)的代碼已經(jīng)自動被放到Development Pods下面了。

  5. 現(xiàn)在如果這就是我們這個(gè)小組件的第一個(gè)版本,當(dāng)前代碼只是寫在本地,需要將他放到遠(yuǎn)程倉庫上。我們在gitoschina建立一個(gè)對應(yīng)的倉庫。

    建立好以后如下圖所示:

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

  6. 代碼雖然已經(jīng)寫完了,但是對應(yīng)的配置信息卻一點(diǎn)都沒有寫,現(xiàn)在來把配置信息補(bǔ)齊。

    Pod::Spec.new do |s|
    s.name             = "PodTestLibrary"    #名稱
    s.version          = "0.1.0"             #版本號
    s.summary          = "Just Testing."     #簡短介紹,下面是詳細(xì)介紹
    s.description      = <<-DESC
                         Testing Private Podspec.
                         * Markdown format.
                        * Don't worry about the indent, we strip it!
                        DESC
    s.homepage         = "https://coding.net/u/wtlucky/p/podTestLibrary"                               #主頁,這里要填寫可以訪問到的地址,不然驗(yàn)證不通過
    # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"           #截圖
    s.license          = 'MIT'              #開源協(xié)議
    s.author           = { "wtlucky" => "wtlucky@foxmail.com" }                   #作者信息
    s.source           = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" }      #項(xiàng)目地址,這里不支持ssh的地址,驗(yàn)證不通過,只支持HTTP和HTTPS,最好使用HTTPS
    # s.social_media_url = 'https://twitter.com/<twitter_username>'                       #多媒體介紹地址
    
    s.platform     = :ios, '7.0'            #支持的平臺及版本
    s.requires_arc = true                   #是否使用ARC,如果指定具體文件,則具體的問題使用ARC
    
    s.source_files = 'Pod/Classes/**/*'     #代碼源文件地址,**/*表示Classes目錄及其子目錄下所有文件,如果有多個(gè)目錄下則用逗號分開,如果需要在項(xiàng)目中分組顯示,這里也要做相應(yīng)的設(shè)置
    s.resource_bundles = {
        'PodTestLibrary' => ['Pod/Assets/*.png']
    }                                       #資源文件地址
    
    s.public_header_files = 'Pod/Classes/**/*.h'   #公開頭文件地址
    s.frameworks = 'UIKit'                  #所需的framework,多個(gè)用逗號隔開
    s.dependency 'AFNetworking', '~> 2.3'   #依賴關(guān)系,該項(xiàng)目所依賴的其他庫,如果有多個(gè)需要填寫多個(gè)s.dependency
    end
    

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

    由于不要依賴第三方庫和別的資源文件,因此s.dependencys.resource_bundles都沒有打開注釋。

  7. 現(xiàn)在本地LJDemoBase代碼和對應(yīng)LJDemoBasepodspec都搞好了,LJDemoBase的遠(yuǎn)程倉庫也建立好了,現(xiàn)在把本地和遠(yuǎn)程的庫關(guān)聯(lián)起來。

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

    liangdeiMac:LJDemoBase apple$ git add .
    liangdeiMac:LJDemoBase apple$ git commit -m"initial LJDemoBase with first version"
    liangdeiMac:LJDemoBase apple$ git remote add origin https://git.oschina.net/dev_liang152/ljdemobase.git
    git push origin master
    
  8. 做完上面的這些操作,再來看oschina上的對應(yīng)倉庫,對應(yīng)的內(nèi)容已經(jīng)全部同步了

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

  9. 在我們使用cocoapods的過程中,常常會發(fā)現(xiàn)當(dāng)搜索某個(gè)庫的時(shí)候會有對應(yīng)的Version,可以使用指定版本的代碼來集成到項(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對應(yīng)相關(guān)版本的代碼,通過git tag的形式來做到區(qū)分版本。

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

    liangdeiMac:LJDemoBase apple$ git tag
    liangdeiMac:LJDemoBase apple$ git tag 0.1.0
    liangdeiMac:LJDemoBase apple$ git tag
    0.1.0
    liangdeiMac:LJDemoBase apple$ git push --tags
    Total 0 (delta 0), reused 0 (delta 0)
    To https://git.oschina.net/dev_liang152/ljdemobase.git
    * [new tag]         0.1.0 -> 0.1.0
    

    查看遠(yuǎn)程倉庫,可以看到這就是剛才的tag

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

    liangdeiMac:LJDemoBase apple$ pod repo push LJDemoSpecs LJDemoBase.podspec 
    
    Validating spec
    -> LJDemoBase (0.1.0)
         - WARN  | url: The URL (https://git.oschina.net/dev_liang152/ljdemobase) is not reachable.
    
    Updating the `LJDemoSpecs' repo
    
    Your configuration specifies to merge with the ref 'refs/heads/master'
    from the remote, but no such ref was fetched.
    
    Adding the spec to the `LJDemoSpecs' repo
    
    - [Add] LJDemoBase (0.1.0)
    
    Pushing the `LJDemoSpecs' repo
    
    To https://git.oschina.net/dev_liang152/ljdemospecs.git
    * [new branch]      master -> master
    
    

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

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


  11. 下面來檢索這個(gè)LJDemoBase,發(fā)現(xiàn)搜索不到,這是緩存的問題

    輸入rm ~/Library/Caches/CocoaPods/search_index.json然后重新搜索,如下

    -> LJDemoBase (0.1.0)
       LJDemoBase基礎(chǔ)組件
       pod 'LJDemoBase', '~> 0.1.0'
       - Homepage: https://git.oschina.net/dev_liang152/ljdemobase
       - Source:   https://git.oschina.net/dev_liang152/ljdemobase.git
       - Versions: 0.1.0 [LJDemoSpecs repo]
    
  12. 現(xiàn)在通過xcode建立主工程LJDemoProject,建立好項(xiàng)目之后使用pod初始化后如圖

  13. 打開LJDemoProject.xcworkspace,編輯Podfile文件,添加source

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

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



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

    liangdeiMac:LJDemoBase apple$ pod repo
    
    LJDemoSpecs
    - Type: git (master)
    - URL:  https://git.oschina.net/dev_liang152/ljdemospecs.git
    - Path: /Users/apple/.cocoapods/repos/LJDemoSpecs
    
    master
    - Type: git (master)
    - URL:  https://github.com/CocoaPods/Specs.git
    - Path: /Users/apple/.cocoapods/repos/master
    
    2 repos
    
  14. 現(xiàn)在在Podfile文件的的父目錄下pod insatll

    liangdeiMac:LJDemoProject apple$ pod install
    Analyzing dependencies
    Downloading dependencies
    Installing LJDemoBase (0.1.0)
    Generating Pods project
    Integrating client project
    Sending stats
    Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
    

    打開LJDemoProject.xcworkspace會看到如下圖所示,這樣我們的組件就被集成進(jìn)項(xiàng)目里了

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

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

細(xì)分組件

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

其實(shí)在使用cocoapods的過程中,會發(fā)現(xiàn)有一個(gè)Subspecs字段,這就是對應(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í)候會自動將已經(jīng)劃分好的目錄結(jié)構(gòu)導(dǎo)入,并且還能夠按需導(dǎo)入,比如說我只需要Base那么可以只導(dǎo)入該組件下的Base,而不會將其他文件導(dǎo)入。

其實(shí)文件的目錄劃分在上面已經(jīng)做好了(這里我是之前劃分好了,你如果沒劃分是要劃分的),現(xiàn)在這里只需要配置一下Specs就可以了。

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


  2. 現(xiàn)在提交新的代碼,提交代碼加打tag都放在下面了

    liangdeiMac:LJDemoBase apple$ git status
    On branch master
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   LJDemoBase.podspec
    
    no changes added to commit (use "git add" and/or "git commit -a")
    liangdeiMac:LJDemoBase apple$ git add .
    liangdeiMac:LJDemoBase apple$ git commit -m"組件內(nèi)部劃分"
    [master 4df9fec] 組件內(nèi)部劃分
    1 file changed, 12 insertions(+), 3 deletions(-)
    liangdeiMac:LJDemoBase apple$ git push
    Counting objects: 3, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 393 bytes | 0 bytes/s, done.
    Total 3 (delta 2), reused 0 (delta 0)
    To https://git.oschina.net/dev_liang152/ljdemobase.git
       d0dae77..4df9fec  master -> master
    liangdeiMac:LJDemoBase apple$ git tag
    0.1.0
    liangdeiMac:LJDemoBase apple$ git tag 0.2.0
    liangdeiMac:LJDemoBase apple$ git push --tags
    Total 0 (delta 0), reused 0 (delta 0)
    To https://git.oschina.net/dev_liang152/ljdemobase.git
    * [new tag]         0.2.0 -> 0.2.0
    
    
  3. 更新spec索引pod repo push LJDemoSpecs LJDemoBase.podspec。

    liangdeiMac:LJDemoBase apple$ pod repo push LJDemoSpecs LJDemoBase.podspec 
    
    Validating spec
    -> LJDemoBase (0.2.0)
        - WARN  | url: The URL (https://git.oschina.net/dev_liang152/ljdemobase) is not reachable.
    
    Updating the `LJDemoSpecs' repo
    
    Already up-to-date.
    
    Adding the spec to the `LJDemoSpecs' repo
    
    - [Update] LJDemoBase (0.2.0)
    
    Pushing the `LJDemoSpecs' repo
    
    To https://git.oschina.net/dev_liang152/ljdemospecs.git
       01c7cdf..f2bb526  master -> master
    
  4. 搜索組件pod search ljdemobase,如下圖所示,現(xiàn)在的Versions有0.1.0和0.2.0,且SubspecsBaseCategory了。

    -> LJDemoBase (0.2.0)
       LJDemoBase基礎(chǔ)組件
       pod 'LJDemoBase', '~> 0.2.0'
       - Homepage: https://git.oschina.net/dev_liang152/ljdemobase
        - Source:   https://git.oschina.net/dev_liang152/ljdemobase.git
       - Versions: 0.2.0, 0.1.0 [LJDemoSpecs repo]
       - Subspecs:
           - LJDemoBase/Base (0.2.0)
           - LJDemoBase/Category (0.2.0)
    
  5. 現(xiàn)在更新一下項(xiàng)目中使用到的組件,pod update --no-repo-update,至于為什么要加后面的參數(shù)是因?yàn)椴蝗绮患拥脑挄?code>pod官方索引,需要的時(shí)間比較長,我們不想更新官方的索引。

    liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
    Update all pods
    Analyzing dependencies
    Downloading dependencies
    Installing LJDemoBase 0.2.0 (was 0.1.0)
    Generating Pods project
    Integrating client project
    Sending stats
    Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
    
  6. 現(xiàn)在再看一下項(xiàng)目中用到的這個(gè)組件,發(fā)現(xiàn)現(xiàn)在對應(yīng)的目錄結(jié)構(gòu)已經(jīng)分好了。

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

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

如何給組件添加依賴

在制作組件的過程中,常常需要依賴一些第三方的框架,常見的如AFNetworkingSDWebimage等,下面講解一下如何添加依賴。

  • 添加依賴的是公開的代碼,如AFNetworking

    1. 添加的配置信息是寫在組件的podspec文件里,很簡單如下所示

    2. 更新到遠(yuǎn)程倉庫,打tag并更新Spec索引

      liangdeiMac:LJDemoBase apple$ git add .
      liangdeiMac:LJDemoBase apple$ git commit -m"添加AFNetworking的依賴"
      liangdeiMac:LJDemoBase apple$ git push
      liangdeiMac:LJDemoBase apple$ git tag 0.3.0
      liangdeiMac:LJDemoBase apple$ git push --tags
      liangdeiMac:LJDemoBase apple$ pod repo push LJDemoSpecs LJDemoBase.podspec 
      
    3. 在項(xiàng)目中使用新版本的組件,下面的命令是在LJDemoProject項(xiàng)目下

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

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


    4. 如果需要給某個(gè)組件的子組件添加依賴庫,那么podspec文件寫作如下所示

      這里我只截圖了spec文件的內(nèi)容,對應(yīng)添加代碼的工作這里就不演示了

    5. 上面的工作都做完以后,現(xiàn)在執(zhí)行我們的更新組件三部曲

      • 推送組件代碼到遠(yuǎn)程,打tag,這里我直接貼圖了,下面的命令在上面的講解中我已經(jīng)講過很多次了

      • 更新spec索引pod repo push LJDemoSpecs LJDemoBase.podspec。

      • 先修改LJDemoProject項(xiàng)目中的Podfile。

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

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

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

      liangdeiMac:LJDemoBase apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject
      liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
      
      • 子組件不依賴第三方
      • 子組件依賴第三方

      可以很清晰的看到,子組件如果依賴第三方庫,當(dāng)使用子組件的時(shí)候會自動幫我們安裝依賴的三方庫,而如果沒有使用依賴三方庫的子組件,并不會安裝對應(yīng)的第三方庫

  • 添加依賴的是私有庫,比如前面寫了個(gè)LJDemoBase,現(xiàn)在又要創(chuàng)建一個(gè)新的組件叫LJDemoView,它依賴于LJDemoBase

    1. LJDemoViewPodfile中添加對應(yīng)的私有pod索引,如下圖所示

      看清楚,這里是LJDemoViewPodfile

    2. LJDemoViewLJDemoView.podspec下添加依賴,下圖中不僅添加了依賴,描述,git地址等配置信息都填好了(因?yàn)檫@是一個(gè)新的組件)

    3. 推送代碼到遠(yuǎn)程倉庫,打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://git.oschina.net/dev_liang152/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 
      
    4. LJDemoProject下的Podfile中添加新的組件,這里為了區(qū)別之前的LJDemoBase組件,把之前的組件注釋掉

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

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

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

如何更新組件

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

  2. tag并推送tag

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

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

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

如何給組件添加資源文件

在開發(fā)組件的過程中,常常需要用到一些資源文件,常見的如圖片,xib等。

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

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

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

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

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

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


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

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

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

    下面我貼下命令

    待修改
    MTdeiMac:~ apple$ cd /Users/apple/.cocoapods/repos
    MTdeiMac:repos apple$ git clone https://git.oschina.net/j1-iOS/ljdemospecs.git
    

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

    現(xiàn)在通過pod repo可以看到有兩個(gè)庫索引,如下圖
    待修改

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

  3. 最后給大家看一下通過組件化開發(fā)以后的完整項(xiàng)目的目錄結(jié)構(gòu)。

  4. 該項(xiàng)目來自小碼哥的一個(gè)組件化開發(fā)后的項(xiàng)目

參考資料:

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

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

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