本文主要介紹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/repos/
資料夾,如果有名字為剛才新增的REPO_NAME的資料夾,那就說明repo add成功。
本地倉庫可以做刪除和更新等操作:
pod repo remove REPO_NAME
pod repo update
複製程式碼
新增私有庫程式碼
在私有倉庫中新增原始碼,這裡暫時先上傳一個資料夾,後面會在podspec中引用這個資料夾。
給私有庫打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.framework 和Foundation.framework ,則為s.frameworks = "UIKit", "Foundation" |
library / libraries | 去掉名字中的lib和.tbd等字尾,多個lib以逗號分隔,例如使用libsqlite3.0.tbd 和libc++.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
複製程式碼
輸出驗證結果:
可以看到輸出中,會有很多WARN,警告的結果就是最後說The spec did not pass validation
,不過它也給出瞭解決方案,就是you can use '--allow-warnings' to ignore them
,修改驗證指令:
pod spec lint SPEC_NAME.podspec --allow-warnings
複製程式碼
忽略警告後,驗證通過:
驗證過程中也可能由於程式碼問題,出現程式碼編譯方面的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'
複製程式碼
成功安裝!在做這行之前,我心裡是拒絕紅色和綠色同時出現的,但在終端裡,這個紅配綠是奪麼和諧!
將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,那可能是它給你的聖誕節彩蛋= =
其實還有一個資料夾目錄的問題,但是不知道為什麼,沒有辦法復現了,所以先不記錄這一條了。