CocoaPods三重奏(二) 之 組件化開發

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的私有倉庫(注:付費)。或者其他的平臺。

14944011544191.png

創建完git倉庫后在終端執行以下命令創建私有倉庫

# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add GDYSpecs http://git.qfpay.net/guodongyang/GDYSpecs.git

如何添加成功,進到~/.cocoapods/repos目錄下面會有剛才添加的倉庫

14944013755592.png

創建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項目。具體步驟如下:

  1. 先cd到你要創建項目的目錄下
  2. 執行創建命令
pod lib create PrivatePodTest

之后會問你五個問題,具體問題看下面截圖,問完問題后自動調用pod install創建項目并生產依賴

PS: 新版創建命令,會默認引入一些框架,例如FBSnapshotTestCase等,不用管,但是當你用新版xcode打開項目的時候,提示你是否切換swift到最新版本(按照流程切換到最新swift版本就行了),因為是這些默認的框架內部用了swift語言。

14944027647226.png

創建完成后通過 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地址。

016E6885-DDB0-46DF-A4CF-3E229952B693.png
14944048008341.png

拿到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
    
A314D2D3-7985-40E5-A587-ACB38494047F.png

看到上面,就證明安裝成功,運行demo測試一下。

提交podspec到Specs倉庫

PS: 在提交podspec文件之前,一定要保證podspec驗證通過并且沒有錯誤,盡量去掉沒用的注釋。

提交podspec文件命令(切換到PrivatePodTest目錄下):

pod repo push GDYSPecs PrivatePodTest.podspec //前面是本地repo倉庫名,后面是要提交的podspec
14944087338838.png

完成之后查看本地repo倉庫GDYSpecs,可以進入~/.cocoapods/repos/GDYSpecs/

14944088256758.png

可以看到,我們已經把這個組件庫添加到 本地spec repo倉庫中了,這個時候你看一下遠端spec repo倉庫,應該也有一次提交,證明我們的podspec文件也提交到了遠端spec repo。

14944091009057.png

至此,組件庫已經創建并且上傳成功,可以通過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。具體步驟如下:

  1. 建源文件添加到classess目錄下,或者從該目錄下刪除文件等修改。

  2. 修改之后提交并推送到遠端,打上新的tag(比如0.0.2)。

  3. 修改之后編輯podspec文件,改為新的tag,或者修改源文件引用路徑等信息。

  4. pod lib lint驗證podspec文件

  5. 驗證沒有問題,把新版本提交到本地spec repo倉庫。

    pod repo push GDYSpecs PrivatePodTest.podspec
    
  6. 添加成功會顯示新添加的版本

?  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目錄下,刪除對應的組件庫

14944125699786.png

然后將git的變動提交并推向遠端

14944126116278.png

到git遠端查看結果:

14944127063269.png

問題總結:

  1. 遇到的問題
    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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容