注:因為最近公司需求澡刹,本文為參考他人網(wǎng)上資源后進行的嘗試,可能與多個網(wǎng)上資源重復
cocoapods的原理
- Pods 項目最終會編譯成一個名為 libPods.a 的文件耘婚,主項目只需要依賴這個 .a 文件即可罢浇。
- 對于資源文件,CocoaPods 提供了一個名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項目編譯的時候都會執(zhí)行嚷闭,將第三方庫的各種資源文件復制到目標目錄中攒岛。
- CocoaPods 通過一個名為 Pods.xcconfig 的文件來在編譯時設(shè)置所有的依賴和參數(shù)。
工具依賴
? ~ nvm --version
0.31.3
? ~ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
? ~ pod --version
1.2.1
? ~ git --version
git version 2.11.0 (Apple Git-81)
tip:本文跳過cocoapods安裝
查看本地pod 倉庫
本地已經(jīng)有一個master庫(安裝pod后自動就會存在胞锰,官方的目錄)
OFToolSpec是后來創(chuàng)建的一個私有庫
Type:版本管理工具類型及分枝名
URL:git倉庫地址
Path:本地倉庫地址(在根目錄下.cocoapods下)
? ~ pod repo
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master
OFToolSpec
- Type: git (master)
- URL: https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec
2 repos
創(chuàng)建pod lib
在桌面創(chuàng)建PodPrivate文件灾锯,然后在終端進入PodPrivate文件并運行命令 pod lib create OFPublicTool
創(chuàng)建私有庫模版
? ~ cd Desktop
? Desktop mkdir PodPrivate
? Desktop cd PodPrivate
? PodPrivate ls
? PodPrivate pod lib create OFPublicTool
以下是配置選擇,可以使用默認選項(帶有下劃線的選項嗅榕,并且除了Prefix前綴設(shè)置顺饮,其他的不區(qū)分大小寫)
- 工程語言
- 是否需要Demo
- 測試框架
- 是否需要view測試
- 工程前綴
//設(shè)置使用的語言
What language do you want to use?? [ Swift / ObjC ]
> ObjC
//是否為library創(chuàng)建一個demo工程
Would you like to include a demo application with your library? [ Yes / No ]
>
yes
//使用的單元測試框架(具體請參看下方`單元測試`鏈接)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
//使用UITest
Would you like to do view based testing? [ Yes / No ]
> no
//你的項目中類的前綴
What is your class prefix?
> OF
單元測試
然后會在當前目錄生成 OFPublicTool
文件夾,并且會在Xcode中自動打開這個項目
注意可能會有一個警告提示
打開
OFPublicTool/Example/OFPublicTool.xcworkspace
工程刪除此處的
ReplaceMe.m
文件誊册,在這里創(chuàng)建將要使用私有庫管理的文件如下:
然后修改此處的 OFPublicTool.podspec
文件领突,下面標注必須修改的地方
創(chuàng)建git私有倉庫(使用coding)
申請賬號后創(chuàng)建Git私有倉庫項目
之后需要在頁面上獲取的信息有
創(chuàng)建pod私有庫
把相關(guān)的信息修改到 OFPublicTool.podspec
中
以下是我的修改
s.summary = 'My PublicTool.'
s.homepage = 'https://coding.net/u/one_fools/p/OFPublicTool'
s.source = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }
之后進入 Example
目錄使用 pod update
命令
? Example git:(master) ? pod update
發(fā)現(xiàn)有報錯信息 The validator for Swift projects uses Swift 3.0 by default...
不過上面有寫到
echo "2.3" > .swift-version
繼續(xù)使用此命令,然后再來一次
? Example git:(master) ? echo "2.3" > .swift-version
? Example git:(master) ? pod update
安裝成功后發(fā)現(xiàn)下面的警告并沒有消失(暫時不管)
對項目進行 command + B
構(gòu)建一次應該會成功案怯,然后在項目中 OFViewController.m
中引入
#import "OFPublicTool.h"
并對項目再次進行 command + B
構(gòu)建君旦,若成功,說明 OFPublicTool.podspec
中的source_files路徑是正確的
若是報錯無法找到文件:
接下來用pod的命令檢查一下此文件下的lib嘲碱。
后退到podspec文件存在的目錄下
? OFPublicTool git:(master) ? pod lib lint
-> OFPublicTool (0.1.0)
OFPublicTool passed validation.
如果出現(xiàn)此處提示說明檢查通過
用 pod spec lint
命令檢查一下遠程的lib金砍,現(xiàn)在沒有提交到git私有倉庫,一定會報錯的
? OFPublicTool git:(master) ? pod spec lint
-> OFPublicTool (0.1.0)
- ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone https://git.coding.net/one_fools/OFPublicTool.git /var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2 --template= --single-branch --depth 1 --branch 0.1.0
Cloning into '/var/folders/dr/688z508n1fb2m9bh9kqs5_ch0000gn/T/d20170520-7169-ee52z2'...
fatal: Remote branch 0.1.0 not found in upstream origin
) during validation.
Analyzed 1 podspec.
[!] The spec did not pass validation, due to 1 error.
發(fā)現(xiàn)報了一個錯誤麦锯,需要一個tag 0.1.0恕稠,下面將本地文件提交到git私有倉庫并打一個0.1.0的tag
? OFPublicTool git:(master) ? git add .
? OFPublicTool git:(master) ? git commit -m"first commit"
? OFPublicTool git:(master) git remote add origin https://git.coding.net/one_fools/OFPublicTool.git
? OFPublicTool git:(master) git push origin master
? OFPublicTool git:(master) git tag -m"tag 0.1.0" 0.1.0
? OFPublicTool git:(master) git push --tags
git操作不再細述
上傳成功之后再次用 pod spec lint
命令檢查一下遠程的lib
? OFPublicTool git:(master) pod spec lint
-> OFPublicTool (0.1.0)
Analyzed 1 podspec.
OFPublicTool.podspec passed validation.
? OFPublicTool git:(master)
發(fā)現(xiàn)通過檢查,這時候可以去私有倉庫看一下會發(fā)現(xiàn)已經(jīng)上傳成功了
本地測試podspec文件
我們可以創(chuàng)建一個新的項目扶欣,在這個項目的Podfile文件中直接指定剛才創(chuàng)建編輯好的podspec文件鹅巍,看是否可用。 在Podfile中我們可以這樣編輯料祠,有兩種方式
platform :ios, '8.0'
target 'XDTestPod' do
pod 'OFPublicTool', :path => '~/.cocoapods/repos/OFPublicToolSpec' #指定路徑
pod 'OFPublicTool', :podspec => '~/.cocoapods/repos/OFPublicToolSpec/OFPublicTool.podspec' #指定podspec文件
end
然后執(zhí)行pod install命令安裝依賴骆捧,打開項目工程,可以看到庫文件都被加載到Pods子項目中了髓绽,不過它們并沒有在Pods目錄下敛苇,而是跟測試項目一樣存在于Development Pods/PodTestLibrary中,這是因為我們是在本地測試顺呕,而沒有把podspec文件添加到Spec Repo中的緣故枫攀。
向Spec Repo提交podspec
但是現(xiàn)在還沒完,接下來我們把podspec文件上傳的我們自己的spec倉庫里株茶,而不是cocoapods的倉庫来涨。
下面我們創(chuàng)建本地倉庫并把這個podspec文件上傳進去
? OFPublicTool git:(master) pod repo
? OFPublicTool git:(master) pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
? OFPublicTool git:(master) pod repo
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/master
OFPublicToolSpec
- Type: git (tags/0.1.0^0)
- URL: https://git.coding.net/one_fools/OFPublicTool.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFPublicToolSpec
OFToolSpec
- Type: git (master)
- URL: https://git.coding.net/one_fools/OFToolRepo.git
- Path: /Users/xiaodou_chenxiaoxiang/.cocoapods/repos/OFToolSpec
3 repos
然后上傳
? OFPublicTool git:(master) pod repo push OFPublicToolSpec OFPublicTool.podspec
Validating spec
-> OFPublicTool (0.1.0)
Updating the `OFPublicToolSpec' repo
Already up-to-date.
Adding the spec to the `OFPublicToolSpec' repo
- [Update] OFPublicTool (0.1.0)
Pushing the `OFPublicToolSpec' repo
To https://git.coding.net/one_fools/OFPublicTool.git
8632a92..98f3d44 master -> master
上傳成功
最后檢驗
? OFPublicTool git:(master) pod search OFPublicTool
Creating search index for spec repo 'OFPublicToolSpec'.. Done!
[!] Unable to find a pod with name, author, summary, or description matching `OFPublicTool`
發(fā)現(xiàn)報錯,這是因為search index中緩存沒有清理忌卤,再次搜索會等待一段時間
? OFPublicTool git:(master) rm ~/Library/Caches/CocoaPods/search_index.json
? OFPublicTool git:(master) pod search OFPublicTool
添加到Cocoapods的官方庫
添加到Cocoapods的官方庫扫夜,可以使用trunk工具,具體可以查看官方文檔驰徊。
pod trunk register 631292061@qq.com 'Ec631292' ---verbose #注冊trunk笤闯,郵箱以及用戶名請使用大家自己的。執(zhí)行這個語句后棍厂,你的郵箱將會受到一封帶有驗證鏈接的郵件颗味,如果沒有請去垃圾箱找找,有可能被屏蔽了牺弹。點擊郵件的鏈接就完成了trunk注冊流程浦马。
pod trunk me #如果終端顯示了你的用戶名和昵稱,則說明注冊成功张漂。
pod trunk push OFPublicTool.podspec #通過trunk上傳你的podspec文件晶默,要cd到podspec文件所在目錄執(zhí)行
最后在一個新項目里引入使用,測試是否ok航攒,只需要在項目的Podfile里增加以下一行代碼即可
pod 'OFPublicTool', '~> 0.1.0'
注:每當你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新執(zhí)行一遍pod update命令磺陡。
更新維護podspec
Pod::Spec.new do |s|
s.name = 'OFPublicTool'
s.version = '0.1.3'
s.summary = 'My PublicTool.'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://coding.net/u/one_fools/p/OFPublicTool'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'ECwlf' => '631292061@qq.com' }
s.source = { :git => 'https://git.coding.net/one_fools/OFPublicTool.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0'
s.subspec 'iCarousel' do |iCarousel|
iCarousel.source_files = 'XDLibrary/Classes/iCarousel/**/*'
iCarousel.public_header_files = 'XDLibrary/Classes/iCarousel/**/*.h'
end
s.subspec 'XDProgress' do |progress|
progress.source_files = 'XDLibrary/Classes/XDProgress/**/*'
progress.public_header_files = 'XDLibrary/Classes/XDProgress/**/*.h'
progress.dependency 'MBProgressHUD', '~> 1.0.0'
end
# s.source_files = 'XDLibrary/Classes/**/*'
# s.resource_bundles = {
# 'XDLibrary' => ['XDLibrary/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
因為我們創(chuàng)建了subspec所以項目整體的依賴dependency,源文件source_files漠畜,頭文件public_header_files币他,資源文件resource等都移動到了各自的subspec中陵刹,每個subspec之間也可以有相互的依賴關(guān)系赂韵,比如XDProgress依賴于MBProgressHUD。不同的子模塊之間還能互相依賴锐帜。
編輯完成之后瘾敢,在測試項目里pod update一下拍冠,幾個子項目都被加進項目工程了,寫代碼驗證無誤之后簇抵,就可以將這個工程push到遠端倉庫庆杜,并打上新的tag->1.0.0。
最后再次使用pod lib lint驗證編輯好的podsepc文件正压,沒有自身的WARNING或者ERROR之后欣福,就可以再次提交到Spec Repo中了,命令跟之前是一樣的
pod repo push OFPublicToolSpec OFPublicTool.podspec
之后再次到~/.cocoapods/repos/OFPublicToolSpec目錄下查看已經(jīng)有兩個版本了焦履。
最后介紹一下如何刪除一個私有Spec Repo拓劝,只需要執(zhí)行一條命令即可
pod repo remove OFPublicToolSpec
這樣這個Spec Repo就在本地刪除了,我們還可以通過
pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
再把它給加回來嘉裤。
如果我們要刪除私有Spec Repo下的某一個podspec怎么操作呢郑临,此時無需借助Cocoapods,只需要cd到~/.cocoapods/repos/OFPublicToolSpec目錄下屑宠,刪掉庫目錄,然后在將Git的變動push到遠端倉庫即可.