注:因?yàn)樽罱拘枨螅疚臑閰⒖妓司W(wǎng)上資源后進(jìn)行的嘗試,可能與多個(gè)網(wǎng)上資源重復(fù)
cocoapods的原理
- Pods 項(xiàng)目最終會(huì)編譯成一個(gè)名為 libPods.a 的文件,主項(xiàng)目只需要依賴這個(gè) .a 文件即可。
- 對(duì)于資源文件,CocoaPods 提供了一個(gè)名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行,將第三方庫的各種資源文件復(fù)制到目標(biāo)目錄中。
- CocoaPods 通過一個(gè)名為 Pods.xcconfig 的文件來在編譯時(shí)設(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)有一個(gè)master庫(安裝pod后自動(dòng)就會(huì)存在,官方的目錄)
OFToolSpec是后來創(chuàng)建的一個(gè)私有庫
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文件,然后在終端進(jìn)入PodPrivate文件并運(yùn)行命令 pod lib create OFPublicTool創(chuàng)建私有庫模版
? ~ cd Desktop
? Desktop mkdir PodPrivate
? Desktop cd PodPrivate
? PodPrivate ls
? PodPrivate pod lib create OFPublicTool
以下是配置選擇,可以使用默認(rèn)選項(xiàng)(帶有下劃線的選項(xiàng),并且除了Prefix前綴設(shè)置,其他的不區(qū)分大小寫)
- 工程語言
- 是否需要Demo
- 測(cè)試框架
- 是否需要view測(cè)試
- 工程前綴
//設(shè)置使用的語言
What language do you want to use?? [ Swift / ObjC ]
> ObjC
//是否為library創(chuàng)建一個(gè)demo工程
Would you like to include a demo application with your library? [ Yes / No ]
>
yes
//使用的單元測(cè)試框架(具體請(qǐng)參看下方`單元測(cè)試`鏈接)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
//使用UITest
Would you like to do view based testing? [ Yes / No ]
> no
//你的項(xiàng)目中類的前綴
What is your class prefix?
> OF
單元測(cè)試
然后會(huì)在當(dāng)前目錄生成 OFPublicTool 文件夾,并且會(huì)在Xcode中自動(dòng)打開這個(gè)項(xiàng)目
注意可能會(huì)有一個(gè)警告提示

打開
OFPublicTool/Example/OFPublicTool.xcworkspace 工程刪除此處的
ReplaceMe.m文件,在這里創(chuàng)建將要使用私有庫管理的文件
如下:

然后修改此處的 OFPublicTool.podspec文件,下面標(biāo)注必須修改的地方

創(chuàng)建git私有倉庫(使用coding)
申請(qǐng)賬號(hào)后創(chuàng)建Git私有倉庫項(xiàng)目

之后需要在頁面上獲取的信息有

創(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 }
之后進(jìn)入 Example目錄使用 pod update命令
? Example git:(master) ? pod update
發(fā)現(xiàn)有報(bào)錯(cuò)信息 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)下面的警告并沒有消失(暫時(shí)不管)
對(duì)項(xiàng)目進(jìn)行 command + B構(gòu)建一次應(yīng)該會(huì)成功,然后在項(xiàng)目中 OFViewController.m 中引入
#import "OFPublicTool.h"
并對(duì)項(xiàng)目再次進(jìn)行 command + B構(gòu)建,若成功,說明 OFPublicTool.podspec 中的source_files路徑是正確的
若是報(bào)錯(cuò)無法找到文件:
接下來用pod的命令檢查一下此文件下的lib。
后退到podspec文件存在的目錄下
? OFPublicTool git:(master) ? pod lib lint
-> OFPublicTool (0.1.0)
OFPublicTool passed validation.
如果出現(xiàn)此處提示說明檢查通過
用 pod spec lint命令檢查一下遠(yuǎn)程的lib,現(xiàn)在沒有提交到git私有倉庫,一定會(huì)報(bào)錯(cuò)的
? 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)報(bào)了一個(gè)錯(cuò)誤,需要一個(gè)tag 0.1.0,下面將本地文件提交到git私有倉庫并打一個(gè)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操作不再細(xì)述
上傳成功之后再次用 pod spec lint命令檢查一下遠(yuǎn)程的lib
? OFPublicTool git:(master) pod spec lint
-> OFPublicTool (0.1.0)
Analyzed 1 podspec.
OFPublicTool.podspec passed validation.
? OFPublicTool git:(master)
發(fā)現(xiàn)通過檢查,這時(shí)候可以去私有倉庫看一下會(huì)發(fā)現(xiàn)已經(jīng)上傳成功了
本地測(cè)試podspec文件
我們可以創(chuàng)建一個(gè)新的項(xiàng)目,在這個(gè)項(xià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命令安裝依賴,打開項(xiàng)目工程,可以看到庫文件都被加載到Pods子項(xiàng)目中了,不過它們并沒有在Pods目錄下,而是跟測(cè)試項(xiàng)目一樣存在于Development Pods/PodTestLibrary中,這是因?yàn)槲覀兪窃诒镜販y(cè)試,而沒有把podspec文件添加到Spec Repo中的緣故。
向Spec Repo提交podspec
但是現(xiàn)在還沒完,接下來我們把podspec文件上傳的我們自己的spec倉庫里,而不是cocoapods的倉庫。
下面我們創(chuàng)建本地倉庫并把這個(gè)podspec文件上傳進(jìn)去
? 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
上傳成功
最后檢驗(yàn)
? 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)報(bào)錯(cuò),這是因?yàn)閟earch index中緩存沒有清理,再次搜索會(huì)等待一段時(shí)間
? 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 #注冊(cè)trunk,郵箱以及用戶名請(qǐng)使用大家自己的。執(zhí)行這個(gè)語句后,你的郵箱將會(huì)受到一封帶有驗(yàn)證鏈接的郵件,如果沒有請(qǐng)去垃圾箱找找,有可能被屏蔽了。點(diǎn)擊郵件的鏈接就完成了trunk注冊(cè)流程。
pod trunk me #如果終端顯示了你的用戶名和昵稱,則說明注冊(cè)成功。
pod trunk push OFPublicTool.podspec #通過trunk上傳你的podspec文件,要cd到podspec文件所在目錄執(zhí)行
最后在一個(gè)新項(xiàng)目里引入使用,測(cè)試是否ok,只需要在項(xiàng)目的Podfile里增加以下一行代碼即可
pod 'OFPublicTool', '~> 0.1.0'
注:每當(dāng)你向Pod中添加了新的文件或者以后更新了podspec的版本都需要重新執(zhí)行一遍pod update命令。
更新維護(hù)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
因?yàn)槲覀儎?chuàng)建了subspec所以項(xiàng)目整體的依賴dependency,源文件source_files,頭文件public_header_files,資源文件resource等都移動(dòng)到了各自的subspec中,每個(gè)subspec之間也可以有相互的依賴關(guān)系,比如XDProgress依賴于MBProgressHUD。不同的子模塊之間還能互相依賴。
編輯完成之后,在測(cè)試項(xiàng)目里pod update一下,幾個(gè)子項(xiàng)目都被加進(jìn)項(xiàng)目工程了,寫代碼驗(yàn)證無誤之后,就可以將這個(gè)工程push到遠(yuǎn)端倉庫,并打上新的tag->1.0.0。
最后再次使用pod lib lint驗(yàn)證編輯好的podsepc文件,沒有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一樣的
pod repo push OFPublicToolSpec OFPublicTool.podspec
之后再次到~/.cocoapods/repos/OFPublicToolSpec目錄下查看已經(jīng)有兩個(gè)版本了。
最后介紹一下如何刪除一個(gè)私有Spec Repo,只需要執(zhí)行一條命令即可
pod repo remove OFPublicToolSpec
這樣這個(gè)Spec Repo就在本地刪除了,我們還可以通過
pod repo add OFPublicToolSpec https://git.coding.net/one_fools/OFPublicTool.git
再把它給加回來。
如果我們要?jiǎng)h除私有Spec Repo下的某一個(gè)podspec怎么操作呢,此時(shí)無需借助Cocoapods,只需要cd到~/.cocoapods/repos/OFPublicToolSpec目錄下,刪掉庫目錄,然后在將Git的變動(dòng)push到遠(yuǎn)端倉庫即可.