1、創(chuàng)建私有Spec Repo
Spec Repo是什么?它是所有的Pods的一個索引,就是一個容器廓推,所有公開的Pods都在這個里面,它實際是一個Git倉庫remote端在GitHub上翩隧,所以想要創(chuàng)建pod私有庫樊展,需要創(chuàng)建類似于master的私有Spec Repo,先在遠程倉庫創(chuàng)建一個工程SGTSpecs鸽心,然后執(zhí)行創(chuàng)建私有Spec Repo命令:
#pod repo add [Private Repo Name][GitHub HTTPS clone URL]
$ pod repo add SGTSpecs https://github.com/Tony-iOS-Personal/SGTSpecs.git
完成本地私有庫的創(chuàng)建滚局,并連接到遠程倉庫
完成之后居暖,進入到~/.cocoapods/repos目錄下就可以看到SGTSpecs這個目錄了顽频。
2、創(chuàng)建Pod項目工程文件
從零開始創(chuàng)建一個組件庫太闺,可以使用Cocoapods提供的工具Using Pod Lib Create?糯景,先cd到要創(chuàng)建項目的目錄然后執(zhí)行
$ pod lib create?SGTToolSDK
然后顯示六個問題,1.選擇一個平臺(?iOS / macOS)省骂;2.選擇你想用的語言(?Swift/ ObjC?)蟀淮;3.是否包含一個演示應用程序;4.需要使用哪些測試框架(?Specta / Kiwi / None)钞澳;5.是否需要基于視圖的測試;6.類前綴怠惶。 ? 6個問題的具體介紹可以去看官方文檔≡冢回答完6個問題他會自動執(zhí)行pod install命令創(chuàng)建項目并生成依賴策治,項目結構如下:
SGTToolSDK
├── Example? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #demo APP
│? ├──SGTToolSDK
│? ├── SGTToolSDK.xcodeproj
│? ├── SGTToolSDK.xcworkspace
│? ├── Podfile? ? ? ? ? ? ? ? ? ? ? ? ? #demo APP 的依賴描述文件
│? ├── Podfile.lock
│? ├── Pods? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #demo APP 的依賴文件
│? └── Tests
├── LICENSE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #開源協(xié)議 默認MIT
├── Pod? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #組件的目錄
│? ├── Assets? ? ? ? ? ? ? ? ? ? ? ? ? ? #資源文件
│? └── Classes? ? ? ? ? ? ? ? ? ? ? ? ? #類文件
├── SGTToolSDK.podspec? ? ? ? ? ? ? ? ? #第三步要創(chuàng)建的podspec文件
└── README.md? ? ? ? ? ? ? ? ? ? ? ? ? ? #markdown格式的README
3、創(chuàng)建私有庫pod組件
所需要做的工作就是在相應的 Pods/Developemnt Pods/ 組件 /Classes 下編碼兰吟,就是向Development Pods文件夾中添加庫文件和資源通惫,將編寫的組件相關的class放入SGTToolSDK/Classes中、資源圖片文件放入SGTToolSDK/Assets中混蔼,并配置podspec文件履腋,然后進入Example文件夾執(zhí)行pod install命令,再打開項目工程可以看到,剛剛添加的組件已經在Pods子工程下Development Pods/SGTToolSDK中了遵湖。
pod會把添加的資源文件編譯成bundle悔政,所以引用資源文件的寫法:
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *bundleURL = [bundle URLForResource:@"SGTToolSDK" withExtension:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
UIImage *img = [UIImage imageNamed:@"you imageName" inBundle:resourceBundle?compatibleWithTraitCollection:nil];
4、編輯podspec文件
創(chuàng)建好的 .podspec 包含大量的注釋說明了每個參數(shù)的含義及用法奄侠。如果想詳細了解可以仔細閱讀卓箫。這里只介紹幾個常用的。
1垄潮、后綴為.podspec文件
該文件為Pods依賴庫的描述文件烹卒,每個Pods依賴庫必須有且僅有那么一個描述文件。文件名稱要和我們想創(chuàng)建的依賴庫名稱保持一致弯洗,我的SGTToolSDK依賴庫對應的文件名為SGTToolSDK.podspec旅急。
1.1 podspec文件內容
SGTToolSDK.podspec的保存內容為:
Pod::Spec.newdo|s|
? s.name? ? ? ? ? ? ='SGTToolSDK'
? s.version? ? ? ? ? ='0.1.0'
? s.summary? ? ? ? ? ='A short description of SGTToolSDK.'
? s.description? ? ? = <<-DESC
TODO: Add long description of the pod here.
?? ? ? ? ? ? ? ? ? ? ? DESC
? s.homepage? ? ? ? ='https://github.com/Tony-iOS-Personal/SGTToolSDK.git'
? # s.screenshots? ? = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
? s.license? ? ? ? ? = { :type =>'MIT', :file =>'LICENSE'}
? s.author? ? ? ? ? = {'sgt' => 'shaoguangtao@zhujia360.com' }
? s.source? ? ? ? ? = { :git =>'https://github.com/Tony-iOS-Personal/SGTToolSDK.git', :tag => s.version.to_s }
? # s.social_media_url = 'https://twitter.com/'
? s.ios.deployment_target ='8.0'
? s.source_files ='SGTToolSDK/Classes/**/*'
? # s.resource_bundles = {
? #? 'SGTToolSDK' => ['SGTToolSDK/Assets/*.png']
? # }
?? s.public_header_files ='SGTToolSDK/Classes/**/*.h'
? # s.frameworks = 'UIKit', 'MapKit'
? # s.dependency 'AFNetworking', '~> 2.3'
end
2.其中需要說明的又幾個參數(shù):
s.name:名稱,pod search 搜索的關鍵詞
s.version:版本
s.summary:簡介牡整,pod search 搜索的關鍵詞
s.homepage:主頁地址藐吮,例如Github地址
s.license:許可證
s.author:作者
s.social_media_url:社交網(wǎng)址
s.platform:平臺
s.source:Git倉庫地址,例如在Github地址后邊加上 .git 就是Git倉庫地址逃贝,常見寫法如下
s.source_files:需要包含的源文件谣辞,常見的寫法如下
s.resources:需要包含的圖片等資源文件
s.dependency:依賴庫,不能依賴未發(fā)布的庫
s.dependency:依賴庫沐扳,如有多個可以這樣寫
s.requires_arc:是否要求ARC
s.source_files 常見寫法
"Directory1/*"? 表示匹配所有文件
"Directory1/Directory2/*.{h,m}"? 表示匹配所有以.h和.m結尾的文件
"Directory1/**/*.h"? 表示匹配所有子目錄
s.source 常見寫法
s.source = { :git => "https://github.com/Tony-iOS-Personal/SGTToolSDK.git", :commit => "68defea" }
s.source = { :git => "https://github.com/Tony-iOS-Personal/SGTToolSDK.git", :tag => 0.1.0 }
s.source = { :git => "https://github.com/Tony-iOS-Personal/SGTToolSDK.git", :tag => s.version }
commit => "68defea" 表示將這個Pod版本與Git倉庫中某個commit綁定
tag => 0.1.0 表示將這個Pod版本與Git倉庫中某個版本的comit綁定
tag => s.version 表示將這個Pod版本與Git倉庫中相同版本的comit綁定
按照上述規(guī)則編輯完成就制作好了 .podspec泥从。
5、驗證倉庫
執(zhí)行以下命令沪摄,為 Pod 添加版本號躯嫉,并打上 tag:
set the new version to?0.1.0
set the new tag to?0.1.0
編輯好后最好先驗證 .podspec 是否有有效
$ pod spec lint
驗證過程中:
->SGTToolSDK
驗證成功后:SGTToolSDK.podspec passed validation.
驗證失敗后:[!] The spec did not pass validation, due to 1 error.
驗證 .podspec 會先測試本地 .podspec 文件是否存在語法錯誤。測試成功再根據(jù) .podspec 文件找到遠端倉庫對應的版本克隆到本地并進行配置杨拐。最后測試文件是否能夠編譯成功祈餐。
.podspec驗證失敗錯誤排查
語法錯誤
如果是因為語法錯誤,驗證失敗后會給出錯誤的準確定位
[!] Invalid `SGTToolSDK.podspec` file: no .floating literal anymore; put 0 before dot
s.version = “0.1.0”
^
SGTToolSDK.podspec:5: syntax error, unexpected tFLOAT, expecting '('
s.version = “0.1.0”
^
標記“^”的地方即為有語法錯誤的地方哄陶。
上述錯誤是因為使用“文本編輯”進行編輯造成的帆阳。使用文本編輯有時候英文""引號會自動變成中文“”引號。
[!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.
使用 vim 將其改為英文的""引號即可屋吨。
依賴錯誤
但是蜒谤,有些非語法錯誤是不會給出錯誤原因的。這個時候可以使用“--verbose”來查看詳細的驗證過程來幫助定位錯誤离赫。
pod spec lint SGTToolSDK.podspec --verbose
如下錯誤通過 --verbose 就可以找到原因芭逝。
-> SGTToolSDK(0.1.0)
- ERROR | [iOS] Encountered an unknown error (The 'Pods' target has transitive dependencies that include static binaries: (/private/var/folders/jz/b_m3k7ln47524cm__h3__mk00000gn/T/CocoaPods/Lint/Pods/BPushSDK/LibBPush/libBPush.a)) during validation.
這個錯誤是因為依賴庫(s.dependency)包含了.a靜態(tài)庫造成的。雖然這并不影響Pod的使用渊胸,但是驗證是無法通過的旬盯。可以通過 --use-libraries 來讓驗證通過。
pod spec lint SGTToolSDK.podspec --verbose --use-libraries
這種情況下使用 --use-libraries 雖然不會出現(xiàn)錯誤(error)胖翰,但是有時候會帶來一些警告(waring)接剩,警告同樣是無法通過驗證的。這時可以用 --allow-warnings 來允許警告萨咳。
pod spec lint SGTToolSDK.podspec --verbose --use-libraries --allow-warnings
安裝錯誤
如果在其他項目 pod install 的過程中懊缺,出現(xiàn)包含“undefined method end_with?' for nil”字樣的報錯。進入“~/.cocoapods/repos”目錄培他,刪除“master”鹃两,并將 master-1 改為 master 即可。
如果出現(xiàn)如下錯誤舀凛,而你的驗證可以通過俊扳,那么一般更新下版本號就可以解決。[!] Unable to find a specification for 'SGTToolSDK'.`
再次驗證
如果錯誤發(fā)生在 .podspec 中猛遍。當修改完時馋记,不需要再次提交就可以直接驗證。如果錯誤發(fā)生在代碼中懊烤,則需要再次提交才能驗證梯醒。
6、上傳代碼到Git
將包含配置好的 .podspec 的項目提交 Git腌紧,并給這次提交打上 tag茸习,可以使用SourceTree處理.
$ git add -A && git commit -m "Release 0.1.0"
$ git tag '0.1.0'
$ git push --tags
$ git push origin master
7、發(fā)布到CocoaPods
沒有自身的WARNING或者ERROR之后寄啼,就可以再次提交到Spec Repo中逮光,命令如下:
$ pod repo push SGTSpecs SGTToolSDK.podspec?--allow-warnings --use-libraries
之后到~/.cocoapods/repos/SGTSpecs目錄下查看代箭,也使用pod search命令查看自己庫:
-> SGTToolSDK (0.1.0)
?? A short description of SGTToolSDK.
?? pod 'SGTToolSDK', '~> 0.1.0'
?? - Homepage: https://github.com/Tony-iOS-Personal/SGTToolSDK.git
?? - Source:? https://github.com/Tony-iOS-Personal/SGTToolSDK.git
?? - Versions: 0.1.0 [SGTSpecs repo]
(END)
這里特別強調一下墩划,如果 s.dependency 中依賴的是 pod 私有庫的話,驗證和提交命令都需要指定 source :
$ pod lib lint --sources=https://github.com/Tony-iOS-Personal/SGTSpecs.git,https://github.com/CocoaPods/Specs.git --allow-warnings --no-clean --use-libraries
$ pod repo push SGTSpecs SGTToolSDK.podspec --sources=https://github.com/Tony-iOS-Personal/SGTSpecs.git,https://github.com/CocoaPods/Specs.git --allow-warnings --no-clean --use-libraries?
8嗡综、項目中導入pod私有庫組件
當你執(zhí)行?pod install?的時候乙帮,CocoaPods 默認只會在master下搜索,而我們的spec是存在我們私有的SGTSpecs目錄下的极景,所以需要在Podfile中指定搜索路徑察净,在文件頂部中如下兩行代碼:
$ source "https://github.com/CocoaPods/Specs.git" #官方倉庫地址
$ source "https://github.com/Tony-iOS-Personal/SGTSpecs.git"? #私有倉庫地址
在指定pod的私有庫組件時有一個坑,如pod ‘YXBase’, ‘~> a.b.1’盼樟,cocoaPods實際pod組件的版本為a.b.x(x為當前版本庫中最大值)氢卡。但如何pod指定版本,這就需要修改Podfile.lock文件中PODS:YXBase的版本號和Podfile文件中YXBase版本號一致