CocoaPods
已經(jīng)出現(xiàn)很多年了牺六,相信很多同學(xué)都會使用梯投,但是你真的知道 CocoaPods
是如何工作的嗎陌僵?
RubyGems
The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” which contains a packaged Ruby application or library.
人們特別是電腦工程師們胎撤,常常從機(jī)器著想。他們認(rèn)為:“這樣做府寒,機(jī)器就能運(yùn)行的更快魁衙;這樣做,機(jī)器運(yùn)行效率更高株搔;這樣做剖淀,機(jī)器就會怎樣怎樣怎樣∠朔浚”實(shí)際上纵隔,我們需要從人的角度考慮問題,人們怎樣編寫程序或者怎樣使用機(jī)器上應(yīng)用程序炮姨。我們是主人捌刮,他們是仆人 ———— Ruby設(shè)計初衷
CocoaPods
是使用 Ruby 語言編寫的一個作為 iOS 的包管理工具,而 RubyGems 是 Ruby 的包管理工具舒岸。安裝 CocoaPods
需要包管理工具 RubyGems
安裝绅作,而 RubyGems
是 Mac 自帶的工具。關(guān)于RubyGems
的更多信息吁津,可以參考 官方文檔 棚蓄。不過,RubyGems 中的 Gems 在國內(nèi)訪問速度很慢碍脏,不過可以使用 Ruby China梭依。如果你想大體了解 Ruby,可以看這篇文章 Ruby典尾。讀到這里相信你對安裝 CocoaPods
已經(jīng)有了一定的了解役拴。
CocoaPods
會被安裝到 /Users/wangsuyan/.cocoapods/repos
更新到最新版本:sudo gem install cocoapods
安裝指定版本: sudo gem install cocoapods -v 1.3.1
Git
掌握 CocoaPods
,需要了解一些 Git 的基本知識钾埂,當(dāng)然你需要至少有一個代碼托管平臺河闰,比如 GitHub。當(dāng)然 這篇文章 講的很不錯褥紫。下面主要說明與這篇文章相關(guān)的內(nèi)容姜性。
git add -A
把文提交到暫存區(qū),等待提交git commit -m "代碼提交信息"
提交代碼到 HEAD髓考,現(xiàn)在部念,你的改動已經(jīng)提交到了 HEAD,但是還沒到你的遠(yuǎn)端倉庫git tag 1.0
給當(dāng)前要提交的版本打個標(biāo)簽git push --tags
提交所有的 tag 到遠(yuǎn)端倉庫
Pod init
它首先需要判斷當(dāng)前目錄有沒有 XCODEPROJ
項(xiàng)目,如果沒有直接報錯儡炼;若果有單個 XCODEPROJ
項(xiàng)目妓湘,會直接創(chuàng)建一個 podfile
文件;如果有多個XCODEPROJ
項(xiàng)目乌询,需要指定一個項(xiàng)目榜贴,否則會報錯:
[!] Multiple Xcode projects found, please specify one
Podfile
經(jīng)過 Pod init
后會生成一個 Podfile
文件。它是一種規(guī)范妹田,描述了一個或多個Xcode項(xiàng)目(target)的依賴關(guān)系唬党。
最簡單的 Podfile
文件,它僅僅給 Target lefeKit 添加一個 SDWebImage 庫秆麸。
platform :ios, '9.0'
target 'lefeKit' do
pod 'SDWebImage'
end
use_frameworks!
使用 Swift 或者動態(tài)庫時需要
- 版本初嘹,比如:
pod 'SDWebImage', '~> 3.7.0'
假如 SDWebImage
目前只有下列版本:
4.1.0, 4.0.0, 4.0.0-beta2, 4.0.0-beta,
3.8.2, 3.8.1, 3.8.0, 3.7.6, 3.7.5, 3.7.4, 3.7.3, 3.7.2, 3.7.1, 3.7.0, 3.6, 3.5.4, 3.5.2, 3.5.1, 3.5,3.4, 3.3, 3.2, 3.1, 3.0,
2.7.4, 2.7, 2.6, 2.5, 2.4
那么 pod 'SDWebImage', '~> 3.7.0'
只會安裝 3.7.6
版本,也就是最后一個 .
的最高版本沮趣;
pod 'SDWebImage', '> 3.7.0'
安裝大于 3.7.0
版本屯烦,當(dāng)然有 >=
, <=
和 <
pod 'SDWebImage', '3.7.6'
指定版本為 3.7.6
-
:path
指定本地的 Pod 庫
pod 'FLoatDemo', :path => '~/Desktop/TestDemo/FLoatDemo'
這里的地址不是隨便一個目錄就可以,必須是一個 Pod 庫房铭,不然會報錯
No podspec found for `FLoatDemo` in `~/Desktop/TestDemo/FLoatDemo`
- 指定來源
如果第三方庫不能滿足您項(xiàng)目的需求驻龟,那么你可以 Fork
一份,來修改第三方代碼缸匪。
pod 'SDWebImage', :git => 'https://github.com/lefex/SDWebImage.git', :commit => '94cdb773d74967f7ba2feecf0d151012bd965fde'
還可以有::branch
翁狐, :tag => '3.1.1'
- Subspecs
某個庫可能很大,但是你僅僅需要某一部分凌蔬,你只需要導(dǎo)入你需要的那部分即可露懒,比如:
如何我們只需要 pod ‘SDWebImage/Core’
也可以:pod 'SDWebImage', :subspecs => ['Core', 'GIF']
- 去除警告
去除全部警告
inhibit_all_warnings!
去除某個庫的警告
pod 'SDWebImage', '~> 4.1.0', :inhibit_warnings => true
pod install
如果修改了 Podfile
文件,那么執(zhí)行 pod install
砂心。執(zhí)行 pod install
后懈词,會根據(jù) Podfile 中的描述來安裝所依賴的庫。這時會生成很多文件辩诞。
- Podfile.lock
這個文件主要用來鎖定 Pods 庫的版本坎弯。保證組內(nèi)成員所使用的三方庫都是統(tǒng)一版本。如果處理不當(dāng)译暂,這里很可能發(fā)生沖突抠忘,而且比較嚴(yán)重。
- Manifest.lock
是 Podfile.lock 的副本外永,每次只要生成 Podfile.lock 時就會生成一個一樣的 Manifest.lock 存儲在 Pods 文件夾下崎脉。在每次項(xiàng)目 Build 的時候,會跑一下腳本檢查一下 Podfile.lock 和 Manifest.lock 是否一致伯顶,如果不一致就拋出異常荧嵌。這是它的腳本呛踊。
diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [ $? != 0 ] ; then
# print error to STDERR
echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2
exit 1
fi
# This output is used by Xcode 'outputs' to avoid re-running this script phase.
echo "SUCCESS" > "${SCRIPT_OUTPUT_FILE_0}"
pod update
僅僅把 Pods 更新到新的版本時需要。比如 lefeKit
項(xiàng)目中當(dāng)前 SDWebImage
的版本為 3.7.0啦撮,這時我修改 Podfile 文件為:pod 'SDWebImage', '>3.6.0'
,執(zhí)行 pod install
后汪厨,本地的 SDWebImage
的版本任然為 3.7.0 赃春。當(dāng)執(zhí)行 pod update
后變?yōu)?4.1.0
發(fā)布一個 Pod 庫
創(chuàng)建
下面以 lefeKit
為例,說明創(chuàng)建私有庫的過程劫乱。
- pod lib create lefeKit
這時需要輸入提示問題织中,按照官方文檔 逐步完成; - 登錄自己的 github衷戈,創(chuàng)建一個名叫
lefeKit
的項(xiàng)目狭吼; - 修改
lefeKit.podspec
文件,
s.source = { :git => 'https://github.com/lefex/lefeKit.git', :tag => s.version.to_s }
需要是你在 github 上創(chuàng)建的項(xiàng)目地址殖妇;s.homepage = 'https://github.com/lefex/lefeKit'
- 根目錄下(lefeKit)創(chuàng)建目錄
Classes
-
pod lib lint
檢查lefeKit.podspec
文件是否有錯刁笙,成功則顯示lefeKit passed validation
; - 一切無誤后谦趣,執(zhí)行
pod trunk push lefeKit.podspec
-
pod trunk me
可以查看我注冊的信息
這些步驟不是所有的都有先后順序疲吸,創(chuàng)建私有庫,關(guān)鍵是創(chuàng)建 xxx.podspec
文件和一個 Repository
前鹅,讓 xxx.podspec
關(guān)聯(lián)到 Repository
摘悴。
發(fā)布成功的提示為:
--------------------------------------------------------------------------------
?? Congrats
?? lefeKit (1.0.0) successfully published
?? August 28th, 21:58
?? https://cocoapods.org/pods/lefeKit
?? Tell your friends!
--------------------------------------------------------------------------------
更新私有庫
- 修改
lefeKit.podspec
文件中的版本號; - tag tat 1.0.0舰绘,添加一個 tag蹂喻;
- git push --tags
pod lib lint
pod trunk push lefeKit.podspec
錯誤總結(jié)
Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.
遇到這個錯誤說明你還沒有注冊賬號,注冊一個郵箱 pod trunk register wsyxyxs@126.com
WARN | url: The URL (https://github.com/lefex1/lefeKit) is not reachable
確保地址可以正確訪問 https://github.com/lefex1/lefeKit
應(yīng)為 https://github.com/lefex1/lefeKit
ERROR | [iOS] file patterns: The `source_files` pattern did not match any file.
找不到資源文件捂寿,在根目錄下創(chuàng)建 Classes
文件夾口四,并創(chuàng)建文件。s.source_files = 'lefeKit/Classes/**/*'
Unable to find a pod with name, author, summary, or description matching `lefeKit`
這個是本地緩存的問題:
清理緩存 rm -rf ~/Library/Caches/Cocoapods
者蠕,執(zhí)行 pod setup
技巧
所有命令后添加 --verbose
窃祝,會顯示更多的調(diào)試信息。
推薦閱讀
【iOS 國際化】如何把國際化時需要3天的工作量縮減到10分鐘
Promise
微信iOS數(shù)據(jù)庫是什么樣的
感謝
===== 我是有底線的 ======
喜歡我的文章踱侣,歡迎關(guān)注我的新浪微博 Lefe_x粪小,我會不定期的分享一些開發(fā)技巧