最近在學習vue.js
的時候發現,vue
的組件化的思想對于編寫代碼是一個非常有用的事情。
首先為什么需要組件化?
下面我列舉了一些比較常見的問題
- 業務模塊劃分不清楚,各模塊之間耦合度很大,難以維護
- 例如我們公司的商城項目隨著功能和時間,代碼量越來越大,早期的一些代碼已經不需要了,但是不敢輕易刪除,不敢保證該文件是夠有被使用。
- 就算手動去查找刪除,也是一件治標不治本的方法,等過一段時間還會出現這種問題
- 所有模塊代碼都編寫在一個項目中,測試某個模塊或功能的時候,需要編譯運行整個項目
- 這一點在做自動化測試的時候尤其明顯,如果某個地方出現問題,現在就無法再繼續進行測試了
- 復用性不好,需要經常造輪子
- 在我們的項目中,如果之前的開發人員離職了,那么他造過哪些輪子,經常后續的開發人員是不了解不清楚的。
- 如果又需要做一些類似的功能,新的開發人員有需要重復造輪子
- 開發效率很低,分工不明確
- 如果有新人加入項目,不能保證可以立刻投入開發。需要較長的時間來熟悉代碼,且新人在熟悉代碼的過程也容易走彎路。
組件化解決問題的思路
利用中間層來做到:只讓別的模塊對中間層產生耦合,中間層不對其他模塊產生耦合
關于這個中間層,這個問題在這里我們就不深究了,大家可以參考蘑菇街解決思路。
組件化的目的
我們可以講每一個模塊作為一個組件。并且建立一個主項目,這個朱羨慕負責集成所有組件。
好處:
- 業務劃分清晰,新人接受項目容易,不同的組件是不同的開發任務,大組件下的小組件是一個小的開發任務
- 項目維護性更強,需要什么功能,很好找到,提高了開發的銷量。
- 能夠更好的發現問題并找到問題,當某個地方出現問題了,可以直接對該組件進行處理,處理好了更新組件就好。
- 開發和測試的時候,可以只編譯自己寫的代碼,不需要編譯全部項目。測試人員也可以測試單個組件。
在這里需要解釋一下什么是組件?
一個分類可以是一個組件,一個輪播圖也可以是一個組件,一個Controller
也是一個組件,甚至一個首頁模塊(包含內部的所有Controller
和業務),都可以是一個組件。
像分類這種被稱為基礎組件,輪播圖這種被稱為UI
組件,Controller
和首頁模塊這種被稱為業務組件。從前到后,從簡單到復雜,都是組件。
我們應該怎么做?
在組件化的架構中,有一個主項目用來負責集成其余組件。每一個組件又是一個單獨的工程。
組件只需要對外提供服務,通過中間件來調用這些服務。
在這里將通過iOS
的cocoapods
私有庫的形式來完成一個組件化的示例。
以cocoapods
的AFNetworking
為例。
[cocoapods的Specs索引]-->(AFNetworking的配置信息)-->C(AFNetworking的具體代碼)
當我們使用pod search AFNetworking
的時候,就是去cocoapods
的Specs
索引中找到AFNetworking
的配置信息,然后通過這個配置信息,配置信息包含的在github
上的代碼地址,去獲得對應的代碼。
現在我們要做的就是按照cocoapods
官方的這一套來生成我們自己的一套,我們自己生成一個非官方的Specs
索引,在這個索引里只存放公司的庫索引,也就是一個個組件,這些組件的具體地址,放到我們想放到的地址下面。如coding
私有庫,碼云,公司部署的gitlab
等。
簡單的來說就是仿照上圖的這三個東西。
準備工作
本地的cocoapods
必須要安裝好,這里有篇文章寫得很好,我就不復述了。文章地址:如何安裝cocoapods
詳細步驟
-
編寫組件代碼,比如一個輪播圖,一個數據庫工具等,具體寫代碼的過程就不說了,這里我使用小碼哥的代碼來做示范,因為這個實踐的文檔也是基于一位講師的文章來做的。
下面是編寫好的代碼,在這里分了兩個模塊,一個是
Base
,一個是Category
。這兩個模塊不依賴于任何別的第三方文件和庫。
-
建立自己的
Spec
索引,這里我們建立在碼云上,因為碼云免費且沒有項目個數的限制。在這里我的Spec
項目名為LJDemoSpecs
,這里我沒有添加ReadMe
和.gitignore
文件。
image這里會驗證一下用戶名和密碼,報錯的原因是由于鑰匙串中存儲著多個
oschina
的用戶名和密碼,刪掉不用的那個就行了。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':
現在前往電腦中的個人下的
.cocoapods
文件夾,可以看到repos
下面有兩個文件夾,一個是master
,一個是LJDemoSpecs
。master
是cocoapods
的官方索引庫,而LJDemoSpecs
是剛才我們建立的私人的索引庫,現在里面還什么都沒有。這里想要查看
.cocoapods
文件夾需要開啟顯示隱藏文件的權限 -
現在利用
pod
來生成一個組件化的項目,這個項目的名字叫做LJDemoBase
。這里不通過
xcode
來建立project
,而是使用pod
命令來直接生成組件化的項目。這里的命令就是
pod lib create LJDemoBase
,它會從cocoapods
的模板中給你clone一個項目。- 詢問你使用的語言
- 是否需要
demo
工程 - 是否使用測試
framework
- 是否基于
View
測試 - 類的前綴
輸入完畢后稍等片刻,
xcode
會自動打開這個項目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`.
-
下面是自動生成的
pod
項目的目錄結構-
Example
主要存放對應的demo
-
LJDemoBase
主要存放代碼和需要的資源 - 而
podspec
文件則是記錄著當前組件的相關信息,包括git
地址,對應的描述,需要依賴的庫等等
-
-
現在把第一步中的代碼添加到這個
pod
項目中,添加代碼的方法有好幾種,這里我僅僅寫我使用的方法。-
在對應的
Example
中編寫調試代碼,編寫完成后如下圖所示 -
代碼已經寫完了,也調試好了。現在將對應的代碼放到
LJDemoBase
下的Classes
文件夾下,將Classes
下已有的Relpace
文件刪除。這里我們直接在
finder
里操作,不是在Example
的workspace
操作。 -
現在刪除
Example
項目中的的Base
和Category
,然后在Example
目錄下使用命令pod install
。對應的結果如下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.
-
再次查看
LJDemoBase.xcworkspace
,可以看到對應的代碼已經自動被放到Development Pods
下面了。
-
-
現在如果這就是我們這個小組件的第一個版本,當前代碼只是寫在本地,需要將他放到遠程倉庫上。我們在
gitoschina
建立一個對應的倉庫。建立好以后如下圖所示:
這里任然不添加
ReadMe
和.gitignore
文件,因為pod lib create
創建的項目里已經有這兩個文件了 -
代碼雖然已經寫完了,但是對應的配置信息卻一點都沒有寫,現在來把配置信息補齊。
Pod::Spec.new do |s| s.name = "PodTestLibrary" #名稱 s.version = "0.1.0" #版本號 s.summary = "Just Testing." #簡短介紹,下面是詳細介紹 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" #主頁,這里要填寫可以訪問到的地址,不然驗證不通過 # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" #截圖 s.license = 'MIT' #開源協議 s.author = { "wtlucky" => "wtlucky@foxmail.com" } #作者信息 s.source = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" } #項目地址,這里不支持ssh的地址,驗證不通過,只支持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目錄及其子目錄下所有文件,如果有多個目錄下則用逗號分開,如果需要在項目中分組顯示,這里也要做相應的設置 s.resource_bundles = { 'PodTestLibrary' => ['Pod/Assets/*.png'] } #資源文件地址 s.public_header_files = 'Pod/Classes/**/*.h' #公開頭文件地址 s.frameworks = 'UIKit' #所需的framework,多個用逗號隔開 s.dependency 'AFNetworking', '~> 2.3' #依賴關系,該項目所依賴的其他庫,如果有多個需要填寫多個s.dependency end
在上面已經將對應的參數通過備注的形式解釋了,下面我貼一下我這個組件的
podspec
的截圖,劃線部分是修改過的地方。
由于不要依賴第三方庫和別的資源文件,因此
s.dependency
和s.resource_bundles
都沒有打開注釋。 -
現在本地
LJDemoBase
代碼和對應LJDemoBase
的podspec
都搞好了,LJDemoBase
的遠程倉庫也建立好了,現在把本地和遠程的庫關聯起來。下面的操作基于
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
-
做完上面的這些操作,再來看
oschina
上的對應倉庫,對應的內容已經全部同步了現在本地和遠程倉庫已經關聯了
-
在我們使用
cocoapods
的過程中,常常會發現當搜索某個庫的時候會有對應的Version
,可以使用指定版本的代碼來集成到項目中,如下圖所示-> 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
對應相關版本的代碼,通過git tag
的形式來做到區分版本。下面我們也給當前的代碼制定一下版本,命令非常簡單,如下所示就是打了個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
查看遠程倉庫,可以看到這就是剛才的
tag
-
現在一切準備就緒,需要將我們寫的這個組件的配置信息加入到私有的
pod
索引里去,也就是第二步中那個Spec
索引。
還是在當前打tag
的目錄執行下面的命令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
下面來看看本地和遠程的索引庫,發現現在都有啦
上面的命令會自動幫我們同步到本地和遠程
-
下面來檢索這個
LJDemoBase
,發現搜索不到,這是緩存的問題輸入
rm ~/Library/Caches/CocoaPods/search_index.json
然后重新搜索,如下-> LJDemoBase (0.1.0) LJDemoBase基礎組件 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]
-
現在通過
xcode
建立主工程LJDemoProject
,建立好項目之后使用pod
初始化后如圖
-
打開
LJDemoProject.xcworkspace
,編輯Podfile
文件,添加source
添加
source
的目的:默認情況下cocoapods
指定使用官方的索引,這里我們不僅要使用官方,也要使用個人私有的索引修改后的文件內容如下:
至于怎么看
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
-
現在在
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
會看到如下圖所示,這樣我們的組件就被集成進項目里了
到這里我們制作集成組件就講的差不多了,下面是補充一些相關的東西
- 如何細分組件,給組件劃分模塊
- 如何給組件添加依賴
- 如何更新組件
- 如何給組件添加資源文件
- 多人協作開發時,如何做到組件化開發
細分組件
在組件的開發過程中,常常會對組件進行結構劃分,例如上面的組件劃分為Base
和Category
,雖然在物理文件夾上將這兩個模塊的代碼分開了。但是在使用代碼的過程中卻并沒有分開,就像15步的最后那張圖,這兩部分的代碼最后被一起放到了LJDemoBae
下。
其實在使用cocoapods
的過程中,會發現有一個Subspecs
字段,這就是對應的組件細分,如下面的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)
下面要做到導入組件的時候會自動將已經劃分好的目錄結構導入,并且還能夠按需導入,比如說我只需要
Base
那么可以只導入該組件下的Base
,而不會將其他文件導入。
其實文件的目錄劃分在上面已經做好了(這里我是之前劃分好了,你如果沒劃分是要劃分的),現在這里只需要配置一下Specs
就可以了。
-
如下圖所示,修改的地方我都已經標注好了
-
現在提交新的代碼,提交代碼加打
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"組件內部劃分" [master 4df9fec] 組件內部劃分 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
-
更新
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
-
搜索組件
pod search ljdemobase
,如下圖所示,現在的Versions
有0.1.0和0.2.0,且Subspecs
有Base
和Category
了。-> LJDemoBase (0.2.0) LJDemoBase基礎組件 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)
-
現在更新一下項目中使用到的組件,
pod update --no-repo-update
,至于為什么要加后面的參數是因為不如不加的話會更新pod
官方索引,需要的時間比較長,我們不想更新官方的索引。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.
-
現在再看一下項目中用到的這個組件,發現現在對應的目錄結構已經分好了。
如果現在只想使用組件中的一個子組件,那么在
Podfile
中可以寫作如下所示修改完畢以后再使用
pod update --no-repo-update
重新安裝一下依賴組件即可
如何給組件添加依賴
在制作組件的過程中,常常需要依賴一些第三方的框架,常見的如AFNetworking
和SDWebimage
等,下面講解一下如何添加依賴。
-
添加依賴的是公開的代碼,如
AFNetworking
-
添加的配置信息是寫在組件的
podspec
文件里,很簡單如下所示
-
更新到遠程倉庫,打
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
-
在項目中使用新版本的組件,下面的命令是在
LJDemoProject
項目下liangdeiMac:LJDemoBase apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
執行完上面的命令,現在來看一下項目中的依賴庫
-
如果需要給某個組件的子組件添加依賴庫,那么
podspec
文件寫作如下所示這里我只截圖了
spec
文件的內容,對應添加代碼的工作這里就不演示了 -
上面的工作都做完以后,現在執行我們的更新組件三部曲
-
推送組件代碼到遠程,打
tag
,這里我直接貼圖了,下面的命令在上面的講解中我已經講過很多次了 -
更新
spec
索引pod repo push LJDemoSpecs LJDemoBase.podspec
。 -
先修改
LJDemoProject
項目中的Podfile。這里分兩種,一種子組件不依賴第三方,一種的子組件依賴第三方
- 不依賴第三方,
pod 'LJDemoBase/Category'
- 依賴第三方,
pod ‘LJDemoBase’, :subspaces =>[‘Category’, ‘Network’]
- 不依賴第三方,
在項目中使用新版本的組件,下面的命令是在
LJDemoProject
項目下liangdeiMac:LJDemoBase apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
- 子組件不依賴第三方
- 子組件依賴第三方
可以很清晰的看到,子組件如果依賴第三方庫,當使用子組件的時候會自動幫我們安裝依賴的三方庫,而如果沒有使用依賴三方庫的子組件,并不會安裝對應的第三方庫
-
-
-
添加依賴的是私有庫,比如前面寫了個
LJDemoBase
,現在又要創建一個新的組件叫LJDemoView
,它依賴于LJDemoBase
-
在
LJDemoView
的Podfile
中添加對應的私有pod
索引,如下圖所示看清楚,這里是
LJDemoView
的Podfile
-
在
LJDemoView
的LJDemoView.podspec
下添加依賴,下圖中不僅添加了依賴,描述,git地址等配置信息都填好了(因為這是一個新的組件)
-
推送代碼到遠程倉庫,打
tag
并更新Spec索引,下面我只貼命令了,相信大家已經知道用什么命令了(前面敲了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
-
在
LJDemoProject
下的Podfile
中添加新的組件,這里為了區別之前的LJDemoBase
組件,把之前的組件注釋掉liangdeiMac:LJDemoView apple$ cd /Users/apple/Documents/LJDemo/LJDemoProject liangdeiMac:LJDemoProject apple$ pod update --no-repo-update
-
組件直接的相互依賴就說到這里,如果還有問題可以參看下面的官方文檔的介紹
如何更新組件
添加對應的代碼,修改
podspec
文件,推送到遠程打
tag
并推送tag
更新
spec
索引,如pod repo push LJDemoSpecs LJDemoBase.podspec
-
使用組件,在項目的
Podfile
中添加我這里只是寫的大體步驟,具體步驟上面做了很多次了,相信都已經很了解了
如何給組件添加資源文件
在開發組件的過程中,常常需要用到一些資源文件,常見的如圖片,xib
等。
這里我就不花大篇幅來講了,大家可以看這個老師寫的添加組件資源的博客
多人協作開發時,如何做到組件化開發
經過上面的講解,相信大家應該知道怎么來制作更新一個組件了,但是上面的一切都是基于個人的操作,如何在團隊中能夠開發并使用是接下來討論的問題。
這里我是基于oschina
建立了一個組織,組織里就是公司的同事。
完成后的組織結構如下圖所示

重要:下面的操作是在另一位同事的電腦上,這個同事叫MT
-
將
LJDemoSpecs
的內容clone
到本地。這里的本地地址為:前往電腦中的個人下的.cocoapods文件夾,可以看到repos下面有一個文件夾master,master里存放的官方的庫索引,我們現在要加入組織的私有庫索引
LJDemoSpecs
。下面我貼下命令
待修改 MTdeiMac:~ apple$ cd /Users/apple/.cocoapods/repos MTdeiMac:repos apple$ git clone https://git.oschina.net/j1-iOS/ljdemospecs.git
做完上面的操作,如下圖所示
現在通過
pod repo
可以看到有兩個庫索引,如下圖
待修改
現在可以把放在
oschina
上的組件和項目都clone下來,然后和文章前面所講的一樣來進行組件的開發和項目的開發了。最后給大家看一下通過組件化開發以后的完整項目的目錄結構。
-
該項目來自小碼哥的一個組件化開發后的項目
參考資料: