CocoaPods三重奏(二) 之 組件化開發
前言
Cocoapods
不僅是一個很好的iOS依賴管理工具,同時也可以使用Cocoapods
管理項目中的公共組件,關于Cocoapods
的安裝和使用可以參考我的另一篇文章Cocoapods安裝和使用,本篇是關于如何使用Cocoapods
進行組件化。
背景
背景1:項目開發到一定階段后會變得很龐大,模塊間的依賴錯從復雜,維護成本增加,并且模塊間緊耦合不利用代碼復用。
背景2:同時開發多個項目,基礎模塊都一樣(比如網絡模塊、model解析模塊,工具模塊等),不同的項目使用不同的模塊。
基于以上背景,可以把公共模塊抽離出來進行組件化重構,然后根據項目自身需要進行組合,提升代碼復用性,降低模塊間耦合。
本文主要介紹,如何通過搭建私有Spec倉庫,然后創建私有pod庫并上傳到Spec倉庫的操作過程讓你了解如何通過Cocoapods
進行組件化開發。
操作步驟
- 創建并設置一個 Spec repo 倉庫來管理
podspec
文件 - 創建私有pod工程,并提交遠程git托管平臺
- 創建pod庫對應的
podspec
文件 - 修改并驗證
podspec
文件是否可用 - 提交
podspec
文件到 Spec 倉庫 - 在項目Podfile中引用常見的pod庫并使用
- 更新維護
podspec
創建私有Spec repo
Spec repo倉庫是什么?它是所有的Pods的一個索引,就是一個容器,所有公開的Pods都在這個里面,它實際是一個Git倉庫remote端在GitHub上,但是當你使用了Cocoapods
后它會被clone到本地的~/.cocoapods/repos
目錄下,可以進入到這個目錄看到master文件夾就是這個官方的Spec Repo了,這個master目錄結構如下:
└── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
而我們需要做的是創建一個類似Spec repo的私有庫,先在 git 上創建一個git倉庫,這個git倉庫可以是私有的也可以是共有的,但是既然是私有的Spec repo,建議還是創建一個私有的git倉庫,如何需要其他同事協同開發,需要把開放git權限給對方,至于如何創建私有倉庫,我用的是我們公司自己搭建的gitlab。也可以使用github的私有倉庫(注:付費)。或者其他的平臺。
創建完git倉庫后在終端執行以下命令創建私有倉庫
# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add GDYSpecs http://git.qfpay.net/guodongyang/GDYSpecs.git
如何添加成功,進到~/.cocoapods/repos目錄下面會有剛才添加的倉庫
創建pod工程
PS:如果你已經有一個組件項目,并且在git版本管理下,那么可以直接為這個項目創建podspec文件。創建它需要執行Cocoapods的另外一個命令,命令如下:,官方文檔在這里,一般情況下,都是從新創建新的pod項目。
pod spec create PrivatePodTest git@git.qfpay.net:guodongyang/TestPodDemo.git
創建完成后,也需要對podspec進行驗證。
pod lib lint
如果你還沒有創建pod項目,那么建議你使用Cocoapods
提供的一個create工具(官方文檔)來創建你的pod項目。具體步驟如下:
- 先cd到你要創建項目的目錄下
- 執行創建命令
pod lib create PrivatePodTest
之后會問你五個問題,具體問題看下面截圖,問完問題后自動調用pod install創建項目并生產依賴
PS: 新版創建命令,會默認引入一些框架,例如FBSnapshotTestCase等,不用管,但是當你用新版xcode打開項目的時候,提示你是否切換swift到最新版本(按照流程切換到最新swift版本就行了),因為是這些默認的框架內部用了swift語言。
創建完成后通過 tree PrivatePodTest -L 2 命令查看目錄結果
PS:如果找不到tree命令,可以通過homebrew安裝tree
? PrivatePodTest tree PrivatePodTest -L 2
PrivatePodTest
├── Example
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ ├── PrivatePodTest
│ ├── PrivatePodTest.xcodeproj
│ ├── PrivatePodTest.xcworkspace
│ └── Tests
├── LICENSE
├── PrivatePodTest
│ ├── Assets
│ └── Classes
├── PrivatePodTest.podspec
├── README.md
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
10 directories, 5 files
接下來向PrivatePodTest文件中添加代碼和資源,然后修改podspec文件,我把一個“文件管理”的共有組件放入PrivatePodTest/Classes中,然后進入Example文件夾執行pod update命令,再打開項目工程可以看到,剛剛添加的組件已經在Pods子工程下Development Pods/PrivatePodTest中了,然后編輯demo工程,測試組件。
PS:這里需要注意的是每當你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新執行一遍pod update命令。或者你打開demo項目,直接把文件拖到對應的目錄下。
項目代碼測試無誤后,將本地項目添加并推送到遠端倉庫,并修改podspec文件。
因為通過Cocoapods
創建的項目本身在本地的git管理控制下,所以如果你想讓別人用,就需要把它推到遠端。同理在git平臺創建一個git項目,然后拿到ssh地址。
拿到ssh地址后,切換到PrivatePodTest目錄下,添加并推送到遠端git。
git add .
git commit -m "initial commit"
git remote add origin git@git.qfpay.net:guodongyang/TestPodDemo.git
git push origin master
因為podspec文件中獲取Git版本控制的項目還需要tag號,所以我們要打上一個tag,并推送tag到遠端。
git tag 0.0.1
git push --tags
修改并驗證podspec文件
接下來開始編輯podspec文件了,它是一個Ruby的文件,把編輯器的格式改成Ruby就能看到語法高亮,下面我貼上我的podspec文件,并在后面以注釋的形式說明每個字段的含義,沒有涉及到的字段可以去官方文檔查閱
Pod::Spec.new do |s|
s.name = 'PrivatePodTest' #項目名稱
s.version = '0.0.1' #當前版本
s.summary = 'Test for private pod' #簡要信息
#項目描述
s.description = <<-DESC
this is a test for private pod.
DESC
s.homepage = 'http://www.lxweimin.com/u/d1a569b086e4' #主頁
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' #截屏
s.license = 'MIT' #開源協議
s.author = { 'guodongyang' => 'guodongyangw@163.com' } #作者信息
s.source = { :git => 'http://git.qfpay.net/guodongyang/TestPodDemo.git', :tag => "0.0.1" } #項目git地址(注:必須是http或者https,不然驗證不通過)
s.ios.deployment_target = '8.0' #部署平臺
s.requires_arc = true #是否需要arc
s.source_files = 'PrivatePodTest/Classes/**/*' #項目源代碼路徑
# s.resource_bundles = {
# 'PrivatePodTest' => ['PrivatePodTest/Assets/*.png']
# } #項目資源文件路徑
s.public_header_files = 'PrivatePodTest/Classes/**/*.h' #項目頭文件路徑
s.frameworks = 'UIKit' #引用的框架
# s.dependency 'AFNetworking', '~> 2.3' #依賴的第三方庫
end
編輯完podspec文件后,需要對其進行驗證,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不過xcode的WARNING是可以存在的,驗證需要執行一下命令
pod lib lint //不予許警告和錯誤
pod lie lint --allow-warnings //允許警告
當出現下面信息,代表驗證通過
-> PrivatePodTest (0.0.1)
PrivatePodTest passed validation.
現在只能只用這個podspec符合驗證,但是不一定能使用。
本地測試podspec文件
本地創建一個項目,然后創建Podfile文件,直接指定創建的podspec文件的路徑,看看是否可用。
具體內容如下:
platform :ios , '8.0'
target 'testPodDemo' do
#pod 'PrivatePodTest', :path => '../PrivatePodTest/PrivatePodTest'
pod 'PrivatePodTest', :podspec => '../PrivatePodTest/PrivatePodTest/PrivateP odTest.podspec'
inhibit_all_warnings!
end
看到上面,就證明安裝成功,運行demo測試一下。
提交podspec到Specs倉庫
PS: 在提交podspec文件之前,一定要保證podspec驗證通過并且沒有錯誤,盡量去掉沒用的注釋。
提交podspec文件命令(切換到PrivatePodTest目錄下):
pod repo push GDYSPecs PrivatePodTest.podspec //前面是本地repo倉庫名,后面是要提交的podspec
完成之后查看本地repo倉庫GDYSpecs,可以進入~/.cocoapods/repos/GDYSpecs/
可以看到,我們已經把這個組件庫添加到 本地spec repo倉庫中了,這個時候你看一下遠端spec repo倉庫,應該也有一次提交,證明我們的podspec文件也提交到了遠端spec repo。
至此,組件庫已經創建并且上傳成功,可以通過pod search進行搜索
如果搜索不到,請看下面相關問題總結。
-> PrivatePodTest (0.0.1)
Test for private pod
pod 'PrivatePodTest', '~> 0.0.1'
- Homepage: http://www.lxweimin.com/u/d1a569b086e4
- Source: http://git.qfpay.net/guodongyang/TestPodDemo.git
- Versions: 0.0.1 [GDYSpecs repo]
...skipping...
$ /usr/bin/git -C /Users/gdy/.cocoapods/repos/GDYSpecs reset --hard
origin/master
HEAD is now at 87d4f21 [Add] PrivatePodTest (0.0.1)
這里是添加組件庫到私有倉庫,如果想添加到cocoapods的開源庫,需要通過trunk工具,具體請參考官方文檔
使用組件庫
組件庫的podspec文件已經添加到遠端私有spec repo倉庫,這時候就可以像Cocoapods使用開源庫一樣使用 組件庫了。
創建一個demo工程,創建Podfile文件,添加依賴如下
pod 'PrivatePodTest' ,'~>0.0.1'
然后執行pod update更新依賴庫,就可以正常使用了。
更新維護podspec
更新維護就是你后續可能修改代碼,或者添加新的功能,或者你不在需要這個組件庫然后需要刪除。
上面我們已經創建了一個0.0.1版本,現在進行升級到0.0.2。具體步驟如下:
建源文件添加到classess目錄下,或者從該目錄下刪除文件等修改。
修改之后提交并推送到遠端,打上新的tag(比如0.0.2)。
修改之后編輯podspec文件,改為新的tag,或者修改源文件引用路徑等信息。
pod lib lint驗證podspec文件
-
驗證沒有問題,把新版本提交到本地spec repo倉庫。
pod repo push GDYSpecs PrivatePodTest.podspec
添加成功會顯示新添加的版本
? GDYSpecs git:(master) tree PrivatePodTest -L 2
PrivatePodTest
├── 0.0.1
│ └── PrivatePodTest.podspec
└── 0.0.2
└── PrivatePodTest.podspec
2 directories, 2 files
7.搜索組件庫,會出現兩個版本
-> PrivatePodTest (0.0.2)
Test for private pod
pod 'PrivatePodTest', '~> 0.0.2'
- Homepage: http://www.lxweimin.com/u/d1a569b086e4
- Source: http://git.qfpay.net/guodongyang/TestPodDemo.git
- Versions: 0.0.2, 0.0.1 [GDYSpecs repo]
刪除本地spec repo倉庫 和組件庫(PrivatePodTest)
刪除本地Spec repo
pod repo remove GDYSpecs
刪除之后也可以從新添加
pod repo add GDYSpecs git@git.qfpay.net:guodongyang/GDYSpecs.git
刪除私有spec repo倉庫下的某個組件庫,直接切換到spec repo目錄下,刪除對應的組件庫
然后將git的變動提交并推向遠端
到git遠端查看結果:
問題總結:
-
遇到的問題
1、執行pod lib create (組件庫) 出錯提示錯誤:rubygems/core_ext/kernel_require.rb:120:in `require': cannot load such file -- colored2 (LoadError) 解決辦法: 輸入上面提示的colored2的兩條gem命令即可解決問題 sudo gem install colored2 sudo gem update --system
2、添加組件庫到私有spec repo倉庫后 執行 pod search搜索不到。
方法一:
先確認你本地倉庫上面確實有你新創建的組件庫,這時候可以先刪除search緩存文件
rm ~/Library/Caches/CocoaPods/search_index.json
,刪除后從新執行pod search ***
方法二:
1.切換到某個項目(含有podfile文件)下
2.執行pod update(提示不能更新)
3.嘗試 pod repo update —verbose獲取詳細信息,我記得是提示我刪除一個 index.lock文件,
4.刪除后從新 執行 pod repo update —verbose 會更新本地私有庫和master倉庫
5.執行pod search *** 創建search索引,可以搜到
2.其他關于pod的問題:
Cocoapods環境配置 :
http://blog.csdn.net/cbl643966855/article/details/51120497
Cocoapods使用私有庫遇到的坑:
http://www.lxweimin.com/p/1e5927eeb341 http://blog.csdn.net/andanlan/article/details/50515434
Cocoapods安裝或更新出錯:
http://blog.csdn.net/lindir/article/details/52980526
Cocoapods search無法搜索:
http://blog.csdn.net/yuanmengong886/article/details/57083919