CocoaPods私有庫

rapunzelyeah發表於2018-01-01

本文主要介紹CocoaPods私有庫的建立,做這件事的主要起因是,公司接過來一個外包的專案,專案中用到了他們的私有庫,pod中可以看到原始碼,雖然直接將原始碼新增到工程中也是可行的,但本著學一點是一點的思想,藉此機會嘗試一下自己做一個私有庫。

首先需要明確一個概念,私有倉庫和私有庫,類比CocoaPods的官方倉庫,私有倉庫就是整個庫,其中會包含多個私有庫以及同一個私有庫的不同版本,在本機~/.cocoapods/repos/路徑下,CocoaPods官方倉庫位於master資料夾中,~/.cocoapods/repos/master/Specs資料夾下儲存的就是各個開源庫的podspec檔案。在終端執行pod repo list可以檢視本地倉庫,名字為master的就是官方倉庫。

因此,在私有庫建立之前,首先要建立一個私有的倉庫:

建立CocoaPods私有倉庫

建立私有倉庫,可以在gitlab,github,coding等網站中直接建立即可,這裡不詳細描述。這裡我用的是coding的git,建立後可以得到倉庫的git地址,需要在本地新增倉庫。

# pod repo add REPO_NAME SOURCE_URL
pod repo add TestRepository https://git.coding.net/rapunzel/TestRepository.git
複製程式碼

新增後可以在本地檢視是否新增成功。

pod repo list
複製程式碼

成功後可以看到輸出:

CocoaPods私有庫
或者也可以直接檢視~/.cocoapods/repos/資料夾,如果有名字為剛才新增的REPO_NAME的資料夾,那就說明repo add成功。

本地倉庫可以做刪除和更新等操作:

pod repo remove REPO_NAME
pod repo update
複製程式碼

新增私有庫程式碼

在私有倉庫中新增原始碼,這裡暫時先上傳一個資料夾,後面會在podspec中引用這個資料夾。

CocoaPods私有庫
給私有庫打tag,這個tag表示後面podspec檔案中的引用版本,因此,每次重新編輯後,要重新打tag,然後再更新podspec檔案,生成新版本的pod庫。

git tag '0.0.1' 
或者 git tag -a 0.0.1 -m 'version 0.0.1'
git push --tags
複製程式碼

建立私有庫

在前面建立倉庫,新增程式碼,打標籤等操作都完成後,就可以真正開始建立私有庫了,這裡主要分為幾個步驟:

1. 建立podspec檔案
2. 編輯podspec檔案
3. 驗證podspec檔案
4. 本地呼叫驗證
5. 將podspec檔案推送到遠端倉庫
複製程式碼

建立podspec檔案

首先進入到庫目錄下:

cd /Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView
複製程式碼

執行建立podspec檔案語句:

pod spec create SPEC_NAME
複製程式碼

在目錄下會出現一個PodTestAlertView.podspec檔案,可以使用sublime開啟。可以看到裡面有很多資訊需要補充:

Pod::Spec.new do |s|

  # ―――  Spec Metadata  ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
  #
  #  These will help people to find your library, and whilst it
  #  can feel like a chore to fill in it's definitely to your advantage. The
  #  summary should be tweet-length, and the description more in depth.
  #

  s.name         = "PodTestAlertView"
  s.version      = "0.0.1"
  s.summary      = "A short description of PodTestAlertView."
  #此處省略一萬字
end
複製程式碼

編輯podspec檔案

本表格大概介紹一下podspec檔案中的每個欄位的含義:

欄位 含義
name 庫名稱,即pod search POD_NAME中的POD_NAME欄位
version 庫版本,這裡需要和上面的tag版本相同
homepage 表示匹配所有子目錄
license 這個不是很瞭解,暫時使用MIT
author 一般會根據本地的git賬戶自動填好
platform / deployment_target 單平臺用platform,多平臺使用deployment_tartet
source git欄位填寫倉庫地址,後面可以使用tag指定標籤,也可以使用commit指定某一次提交
source_files 指定庫原始檔的位置,如果倉庫中包含多個pod庫,那麼在引用pod庫時,則需要指定是什麼庫的檔案
resource / resources 資原始檔,和source_files格式類似
framework / frameworks 去掉.framework字尾,多個framework以逗號分隔,例如使用UIKit.frameworkFoundation.framework,則為s.frameworks = "UIKit", "Foundation"
library / libraries 去掉名字中的lib和.tbd等字尾,多個lib以逗號分隔,例如使用libsqlite3.0.tbdlibc++.tbd,則為s.libraries = "sqlite3.0", "c++"
dependency 依賴的第三方庫,可以指定版本,例如s.dependency "JSONKit", "~> 1.4",也可以不指定版本,例如s.dependency "JSONKit"將預設使用最新版本;這裡也可以使用自己的私有庫,使用私有庫在驗證podspec時需要進行私有庫地址的搜尋,新增--sources = 'SOURCE_URL1, SOURCE_URL2',否則只會在官方倉庫搜尋,導致依賴庫找不到的問題

source_files欄位,表示在倉庫中尋找並新增的檔案型別,需要指定要新增的檔案路徑。例如我的目錄中,這個欄位就可以寫成s.source_files = "PodTestAlertView/*.{h,m}"

source_files欄位 匹配檔案型別
* 表示匹配所有檔案
*.{h,m} 表示匹配所有以.h和.m的檔案
** 表示匹配所有子目錄

編輯後的podspec檔案大概如下:

Pod::Spec.new do |s|

  s.name         = "PodTestAlertView"
  s.version      = "0.0.3"
  s.summary      = "A short description of PodTestAlertView."
  s.homepage     = "http://EXAMPLE/PodTestAlertView"
  s.license      = "MIT"
  s.author       = "zhangmj"
  s.platform     = :ios, "8.0"
  s.source       = { :git => "https://git.coding.net/rapunzel/TestRepository.git", :tag => "#{s.version}" }
  s.source_files = "PodTestAlertView/*.{h,m}"
  s.frameworks   = "UIKit"
  s.dependency "IQKeyboardManager"

end
複製程式碼

驗證podspec檔案

驗證podspec檔案命令:

pod spec lint SPEC_NAME.podspec
複製程式碼

輸出驗證結果:

CocoaPods私有庫
可以看到輸出中,會有很多WARN,警告的結果就是最後說The spec did not pass validation,不過它也給出瞭解決方案,就是you can use '--allow-warnings' to ignore them,修改驗證指令:

pod spec lint SPEC_NAME.podspec --allow-warnings
複製程式碼

忽略警告後,驗證通過:

CocoaPods私有庫
驗證過程中也可能由於程式碼問題,出現程式碼編譯方面的error,可以新增--verbose來檢視詳細的log:

pod spec lint SPEC_NAME.podspec --verbose
複製程式碼

根據其中提示的程式碼方面的錯誤,庫引用方面的錯誤,修改程式碼,上傳更新,重新打標籤,修改podspec檔案的引用版本,繼續驗證。

這裡如果在依賴時呼叫了自己的庫,則需要在後面新增私有庫地址的SOURCE_URL,因為驗證時預設只搜尋官方倉庫,例:

pod spec lint --allow-warnings SPEC_NAME.podspec --sources='YOUR_PRIVATE_SOURCE_URL, https://github.com/CocoaPods/Specs.git'
複製程式碼

本地呼叫驗證

驗證podspec檔案的正確性後,可以在本地先進行一次安裝,沒問題後再推送到倉庫,修改podfile,指定podspec地址為本地的地址:

pod 'PodTestAlertView', :podspec => '/Users/masaike/.cocoapods/repos/TestRepository/PodTestAlertView/PodTestAlertView.podspec'
複製程式碼

成功安裝!在做這行之前,我心裡是拒絕紅色和綠色同時出現的,但在終端裡,這個紅配綠是奪麼和諧!

CocoaPods私有庫

將podspec檔案推送到遠端倉庫

本地驗證通過後就可以上傳版本了,推送podspec檔案使用指令:

pod repo push REPO_NAME SPEC_NAME.podspec
複製程式碼

如果在上一步驗證時使用了--allow-warnings來忽略警告,在推送podspec檔案時也需要忽略警告:

pod repo push REPO_NAME SPEC_NAME.podspec --allow-warnings
複製程式碼

開始推送後,一般會報一個錯誤[!] The repo 'TestRepository' at '..' is not clean,原因是podspec檔案是直接在repo下生成的,本地的repo 和遠端倉庫相比,多了一個podspec檔案,所以可以選擇將podspec檔案移到別的位置,讓本地的repo和遠端保持同步,重新推送。

Validating spec
 -> PodTestAlertView (0.0.3)
    - WARN  | homepage: The homepage has not been updated from default
    - WARN  | summary: The summary is not meaningful.
    Updating the 'TestRepository' repo

From https://git.coding.net/rapunzel/TestRepository
 * [new tag]         0.0.1      -> 0.0.1
 * [new tag]         0.0.2      -> 0.0.2
 * [new tag]         0.0.3      -> 0.0.3
Already up-to-date.

Adding the spec to the 'TestRepository' repo

 - [Update] PodTestAlertView (0.0.3)

Pushing the 'TestRepository' repo
複製程式碼

推送成功後,遠端倉庫和本地repo都可以看到一個名字和version相同的資料夾,裡面包含剛才新增的podspec檔案,代表這個版本的podspec檔案,然後就可以試試使用私有庫了~

使用私有庫

在podfile中新增私有倉庫地址,同時也要新增官方倉庫地址,否則只會在私有倉庫中搜尋:

source 'https://git.coding.net/rapunzel/TestRepository.git' #私有倉庫地址
source 'https://github.com/CocoaPods/Specs.git' #官方倉庫地址

platform:ios, '8.0'

target 'test' do  #工程名稱

    #三方開源
    pod 'IQKeyboardManager'
    #私有庫
    pod 'PodTestAlertView'
    
end

複製程式碼

如果可以成功安裝,那就ok啦!

一些問題

引用的檔案生成的framework,此處感謝此分享的提示

在podspec檔案中有一個欄位是vendored_frameworks,可以使用自己生成的framework:

s.vendored_frameworks = 'Pod/Assets/*.framework'
複製程式碼

然後在驗證和push到遠端倉庫時需要新增--user-libraries

git push origin master比較慢

如果和我一樣用的是Coding,那可能是它給你的聖誕節彩蛋= =

CocoaPods私有庫
其實還有一個資料夾目錄的問題,但是不知道為什麼,沒有辦法復現了,所以先不記錄這一條了。

感謝資源分享

建立Podspec描述檔案

使用CocoaPods建立私有庫

使用Cocoapods建立私有podspec

iOS CocoaPods 私有庫 steps and tips

相關文章