廢話不多說,開始
1.首先注冊一個CocoaPods的賬戶
pod命令:
$ pod trunk register EMAIL [YOUR_NAME]
舉個例子:
$ pod trunk register nezha@fengshen.com 'Ne Zha'
2.創建Git倉庫,需要帶上MIT許可。
Git的倉庫可以是GitHub這種公共的源,也可以是你們自己搭建的,像我這種普通玩家還是建一個GitHub的倉庫來的實在。
3.把剛剛創建的倉庫克隆到本地(高級->master)
對于Git,我還是喜歡用sourcetree,看得見的才放心。
4.把Framework拖到本地倉庫文件夾中
拖進來之后,sourcetree就會提示你本地有變動。然后就是提交(Commit)。
5.打標簽,推送到遠程倉庫
打標簽就是在push之前,用sourcetree給本次更新打一個tag。這個tag很重要,tag建議使用1.2.3
這樣的版本號,因為這個tag就是CocoaPods以后需要使用的版本號。
6.創建podSpec文件
最重點的就是這個podSpec文件,這里面記錄著你Pod所有的信息。
提示:我是cd到本地倉庫文件夾做的操作。我的本地倉庫中把MIT Licence 文件也克隆了下來,所有在我的本地倉庫文件夾中是有licence文件的,如果沒有這個文件會報警告,但是不影響。
pod命令:
$ pod spec create xxx
舉個例子:
$ pod spec create NeZha
重點
podSpec文件
Pod::Spec.new do |spec|
spec.name = "NeZha"
spec.version = "1.2.3" #此處要與上傳到Git的tag一致
spec.summary = "This is my test pod." #摘要,隨便寫
spec.homepage = "https://github.com/NeZha" #主頁,隨便寫
spec.license = "MIT" #許可證類型,我只會MIT,其它的請自行Google
spec.author = { "Ne Zha" => "nezha@fengshen.com" } #作者和郵箱地址,隨便寫
spec.platform = :ios, "8.0" #支持的平臺,以及支持的最低系統版本
spec.source = { :git => "https://github.com/NeZha.git", :tag => "#{spec.version}" }
spec.source_files = "NeZha.framework/Headers/*.{h}" #001號 坑
spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' } #002號 坑
spec.ios.vendored_frameworks = 'NeZha.framework' #003號 坑
spec.requires_arc = true #是否需要ARC
spec.frameworks = "Foundation", "UIKit" #依賴多個系統framework
spec.libraries = 'iconv', 'xml2' # 004號 坑
spec.dependency "AFNetworking", "3.2.1" #依賴三方的庫,如果想要添加多個依賴,不可以用逗號隔開,應該依賴一個寫一句。
spec.dependency "FMDB", "2.7.5"
end
坑點:
001號:這里要注意文件路徑層級,層級從本地倉庫內開始算為第一層,如圖:
這個路徑就應該寫成:
spec.source_files = "NeZha.framework/Headers/*.{h}"
002號:我的SDK里用到了Category,所以手動集成時要在Other Linker Flags中添加-ObjC。但是我在CocoaPods中一直找不到怎么自動設置這個工程配置,后來也是在CocoaPods官網一個一個試驗出來的。
spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-lObjC' }
003號:這個地方就是和我以前只上傳.h .m 源碼的最大區別。Framework講到底不是文件,是一個文件夾,而且是一個特殊的文件夾。想要Framework正常使用,必須用到這句。而且這里可以用逗號隔開,添加多個Framework,比如:
spec.ios.vendored_frameworks = 'NeZha.framework', 'AoBing.framework', 'TaiYi.framework'
004號:設置依賴多個系統的library。設置library有個小坑,正常在Xcode里我們見到的一般都叫libz.tbd、libxml2.tbd,但是這里不能這么寫,lib要去掉,.tbd也要去掉,只留下 z 或者 xml2 這個名字就行。
7.驗證podspec文件語法
pod命令:
pod spec lint xxx.podspec
舉個例子:
pod spec lint NeZha.podspec
這一步,Error不能忽略(你也過不去)必須解決。Warning可忽略。如果出錯了卻看不到具體錯誤信息,可以在命令后面加--verbose
,比如:
pod spec lint NeZha.podspec --verbose
這樣就會有詳細的debug信息打印出來。
8.發布到CocoaPods
pod命令:
pod trunk push xxx.podspec
舉個例子:
pod trunk push NeZha.podspec
發布成功會提示你Tell your friends,然后還有個小火箭??。
另外
有個特殊情況,比如你的Framework強依賴AFNetworking,即在文件中import了AFN的頭文件之類的操作,但是作為一個不為別人添麻煩的Framework應該學會照顧自己。也就是說當有些人的工程中采用手動方式集成了AFN,而你的Pod依賴了AFN,這樣Pod中有一份AFN,主工程中有一份AFN,就會造成重復導入的情況。
那么,如果我們不在podSpec中依賴AFN是不是就可以了呢?;卮鹗牵阂话闱闆r下不行。你會發現如果你直接pod spec lint去檢查語法,會報錯,找不到文件。也就是說當你trunk push的時候你也是push不了的。因為CocoaPods上傳時會先調用xcodebuild,檢查一遍文件是否可以正常編譯。
解決辦法就是:
pod trunk push xx.podspec --skip-import-validation
跳過import的檢查就行了
再另外
一般剛剛push到CocoaPods的新庫,此時你pod search 是搜不到的,執行下列命令:
pod setup
rm ~/Library/Caches/CocoaPods/search_index.json
pod search NeZha