為什么我還在寫 CocoaPods 的教程

CocoaPods 已經(jīng)出現(xiàn)很多年了,相信很多同學(xué)都會(huì)使用,但是你真的知道 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ī)器就會(huì)怎樣怎樣怎樣?!睂?shí)際上,我們需要從人的角度考慮問題,人們怎樣編寫程序或者怎樣使用機(jī)器上應(yīng)用程序。我們是主人,他們是仆人 ———— Ruby設(shè)計(jì)初衷

CocoaPods 是使用 Ruby 語言編寫的一個(gè)作為 iOS 的包管理工具,而 RubyGems 是 Ruby 的包管理工具。安裝 CocoaPods 需要包管理工具 RubyGems 安裝,而 RubyGems 是 Mac 自帶的工具。關(guān)于RubyGems的更多信息,可以參考 官方文檔 。不過,RubyGems 中的 Gems 在國內(nèi)訪問速度很慢,不過可以使用 Ruby China。如果你想大體了解 Ruby,可以看這篇文章 Ruby。讀到這里相信你對安裝 CocoaPods 已經(jīng)有了一定的了解。

CocoaPods 會(huì)被安裝到 /Users/wangsuyan/.cocoapods/repos

更新到最新版本:sudo gem install cocoapods

安裝指定版本: sudo gem install cocoapods -v 1.3.1

Git

掌握 CocoaPods ,需要了解一些 Git 的基本知識,當(dāng)然你需要至少有一個(gè)代碼托管平臺,比如 GitHub。當(dāng)然 這篇文章 講的很不錯(cuò)。下面主要說明與這篇文章相關(guān)的內(nèi)容。

  • git add -A
    把文提交到暫存區(qū),等待提交

  • git commit -m "代碼提交信息"
    提交代碼到 HEAD,現(xiàn)在,你的改動(dòng)已經(jīng)提交到了 HEAD,但是還沒到你的遠(yuǎn)端倉庫

  • git tag 1.0
    給當(dāng)前要提交的版本打個(gè)標(biāo)簽

  • git push --tags
    提交所有的 tag 到遠(yuǎn)端倉庫

Pod init

它首先需要判斷當(dāng)前目錄有沒有 XCODEPROJ 項(xiàng)目,如果沒有直接報(bào)錯(cuò);若果有單個(gè) XCODEPROJ 項(xiàng)目,會(huì)直接創(chuàng)建一個(gè) podfile 文件;如果有多個(gè)XCODEPROJ 項(xiàng)目,需要指定一個(gè)項(xiàng)目,否則會(huì)報(bào)錯(cuò):

[!] Multiple Xcode projects found, please specify one

Podfile

經(jīng)過 Pod init 后會(huì)生成一個(gè) Podfile 文件。它是一種規(guī)范,描述了一個(gè)或多個(gè)Xcode項(xiàng)目(target)的依賴關(guān)系。

最簡單的 Podfile 文件,它僅僅給 Target lefeKit 添加一個(gè) SDWebImage 庫。

platform :ios, '9.0'
target 'lefeKit' do
  pod 'SDWebImage'
end
  • use_frameworks!

使用 Swift 或者動(dòng)態(tài)庫時(shí)需要

  • 版本,比如: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' 只會(huì)安裝 3.7.6 版本,也就是最后一個(gè) . 的最高版本;

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'

這里的地址不是隨便一個(gè)目錄就可以,必須是一個(gè) Pod 庫,不然會(huì)報(bào)錯(cuò)

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

某個(gè)庫可能很大,但是你僅僅需要某一部分,你只需要導(dǎo)入你需要的那部分即可,比如:

SDWebimage.png

如何我們只需要 pod ‘SDWebImage/Core’
也可以:pod 'SDWebImage', :subspecs => ['Core', 'GIF']

  • 去除警告

去除全部警告
inhibit_all_warnings!

去除某個(gè)庫的警告
pod 'SDWebImage', '~> 4.1.0', :inhibit_warnings => true

pod install

如果修改了 Podfile 文件,那么執(zhí)行 pod install。執(zhí)行 pod install 后,會(huì)根據(jù) Podfile 中的描述來安裝所依賴的庫。這時(shí)會(huì)生成很多文件。

  • Podfile.lock

這個(gè)文件主要用來鎖定 Pods 庫的版本。保證組內(nèi)成員所使用的三方庫都是統(tǒng)一版本。如果處理不當(dāng),這里很可能發(fā)生沖突,而且比較嚴(yán)重。

  • Manifest.lock

是 Podfile.lock 的副本,每次只要生成 Podfile.lock 時(shí)就會(huì)生成一個(gè)一樣的 Manifest.lock 存儲在 Pods 文件夾下。在每次項(xiàng)目 Build 的時(shí)候,會(huì)跑一下腳本檢查一下 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 更新到新的版本時(shí)需要。比如 lefeKit 項(xiàng)目中當(dāng)前 SDWebImage 的版本為 3.7.0,這時(shí)我修改 Podfile 文件為:pod 'SDWebImage', '>3.6.0',執(zhí)行 pod install 后,本地的 SDWebImage 的版本任然為 3.7.0 。當(dāng)執(zhí)行 pod update 后變?yōu)?4.1.0

發(fā)布一個(gè) Pod 庫

創(chuàng)建

下面以 lefeKit 為例,說明創(chuàng)建私有庫的過程。

  • pod lib create lefeKit
    這時(shí)需要輸入提示問題,按照官方文檔 逐步完成;
  • 登錄自己的 github,創(chuàng)建一個(gè)名叫 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 文件是否有錯(cuò),成功則顯示 lefeKit passed validation;
  • 一切無誤后,執(zhí)行 pod trunk push lefeKit.podspec
  • pod trunk me 可以查看我注冊的信息

這些步驟不是所有的都有先后順序,創(chuàng)建私有庫,關(guān)鍵是創(chuàng)建 xxx.podspec 文件和一個(gè) 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,添加一個(gè) tag;
  • git push --tags
  • pod lib lint
  • pod trunk push lefeKit.podspec

錯(cuò)誤總結(jié)

Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.

遇到這個(gè)錯(cuò)誤說明你還沒有注冊賬號,注冊一個(gè)郵箱 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`

這個(gè)是本地緩存的問題:
清理緩存 rm -rf ~/Library/Caches/Cocoapods,執(zhí)行 pod setup

技巧

所有命令后添加 --verbose,會(huì)顯示更多的調(diào)試信息。

推薦閱讀

【iOS 國際化】如何把國際化時(shí)需要3天的工作量縮減到10分鐘
Promise
微信iOS數(shù)據(jù)庫是什么樣的

感謝

關(guān)于 Podfile.lock 帶來的痛

BY Blog

pluto-y

Cocoapods

Ruby China

===== 我是有底線的 ======
喜歡我的文章,歡迎關(guān)注我的新浪微博 Lefe_x,我會(huì)不定期的分享一些開發(fā)技巧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容