更新時間:2020.6.28
安裝方式有兩種,第一種使用普通的終端命令行去安裝,第二種使用工具Homebrew去安裝,homebrew是一個安裝包工具,可以安裝node、git、Cocoapods等工具,相當好用,如何安裝Homebrew移駕我的另一篇文章。Homebrew是什么?以及使用
特別更新 + 特別重要(如果你遇到pod install、pod update無法更新下載)
下面我要說的是卡了我一周的一個問題~
因為換了一臺新設(shè)備,于是我滿心歡心的安裝Homebrew、RVM、Ruby,接下來就是安裝Cocoapods,安裝時候怎么都下載不下來cocoapods所需要spec,一周后終于在一個博客上看到,Cocoapods源改變了,以前依據(jù)master索引,現(xiàn)在是CDN的Trunk下的索引。Cocoapods 從1.8版本開始CocoaPods將默認源切換到了CDN服務(wù),也就是不再將整個的repo master先下載下來才能正常使用pods而是用按需下載。pod install 和 pod update 速度都很快。怎么做呢?跟我來~
- 1.刪除原來的master索引,使用最新的trunk下的索引
- 2.查看遠程源列表: pod repo list
master
Type: git (master)
URL: https://github.com/CocoaPods/Specs.git
Path: /Users/iroot/.cocoapods/repos/master
trunk
Type: CDN
URL: https://cdn.cocoapods.org/
- 3.手動刪除master,前往路徑:~/.cocoapods/repos/
- 4.使用 "ping https://raw.githubusercontent.com"命令,ping通后將顯示的ip地址與域名追加到hosts文件最后一行,ip地址根據(jù)實際顯示地址添加即可
- 5.先cd到etc文件夾,然后執(zhí)行open . 指令,注意有個點哦。
$ cd /etc
$ /etc open .
找到host文件,拷貝分到桌面,將
151.101.228.133 raw.githubusercontent.com追加到最后一行,保存。然后替換原有的host文件
sudo vi /etc/hosts
添加 199.232.4.133 raw.githubusercontent.com,這樣我們不需要master這個文件,我們也能正常通過cdn的方式使用cocoapods了
正文
一、CocoaPods簡介
CocoaPods是IOS項目上負責管理依賴的工具,即對第三方庫的依賴。開發(fā)iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現(xiàn)使得我們可以節(jié)省設(shè)置和更新第三方開源庫的時間。
二、使用Homebrew工具安裝 Ruby + CocoaPods
安裝ruby(這里使用Homeview來安裝ruby,安裝Homebrew的方法在文章開頭有鏈接)
- 1.brew install ruby(安裝最新版的ruby)
- 2.ruby --version(ruby版本)
- 3.curl -sSL https://get.rvm.io | bash -s stable(RVM 是一個便捷的多版本 Ruby 環(huán)境的管理和切換工具.安裝它,官網(wǎng):https://rvm.io/)
- 4.rvm get stable(rvm更新)
- 5.rvm --version(rvm版本)
- 6.sudo gem update --system(gem更新)
- 7.gem sources --remove https://rubygems.org/(移除之前的源)
- 8.gem sources --add https://gems.ruby-china.com/(設(shè)置新的源)
- 9.gem sources -l(查看當前源)
- 10.gem --version(gem版本)
注意:如果你第一次安裝ruby你可以忽略345的命令,還有就是遇到Y(jié)ou can try adding it manually in `/Users/XXX/.cocoapods/repos` 這種問題直接去github下載然后放到路徑下就好了,是因為文件太大網(wǎng)不好。
安裝cocoapods
- 1.sudo gem install -n /usr/local/bin cocoapods(安裝cocoapods)
- 2.pod setup(安裝本地庫)
- 3.pod repo update(更新本地庫)
- 4.pod --version(pod版本)
卸載cocoapods
- 1.sudo gem uninstall -n /user/local/bin cocoapods
三、使用終端命令安裝 Ruby + CocoaPods
安裝ruby
- 1.ruby -v(查看當前ruby版本)
- 2.gem sources -l(查看當前鏡像地址)
- 3.gem sources --remove https://rubygems.org/(移除原本鏡像地址)
- 4.gem sources -a https://gems.ruby-china.com(替換鏡像,防止被翻)
- 5.gem sources -l(檢查替換鏡像是否成功)
安裝Cocoapods
- 1.sudo gem install cocoapods
四、安裝好Cocoapods的使用
- 1.新建一個項目,假設(shè)項目名稱為HelloWord
- 2.終端輸入:cd HelloWord文件路徑
- 3.創(chuàng)建Podfile配置文件,終端輸入:vim Podfile
- 4.接著鍵盤輸入i進入編輯模式,繼續(xù)輸入以下內(nèi)容:
platform:ios, '8.0'
target 'HelloWord'
pod 'Masonry', '~> 1.1.0'
- 5.鍵盤按下ESC鍵,然后輸入“:wq”進入vim命令模式,回車
- 6.終端繼續(xù)輸入pod install,到此恭喜你,你安裝好了CocoaPods,并且導(dǎo)入了一個第三方庫Masonry,以后打開該項目只需找到HelloWord文件夾下后綴名為.xcworkspace打開即可。
五、CocoaPods命令集合
1.pod init :初始化
2.pod install :安裝庫
3.pod update :更新庫
4.pod search XXX :查找所需三方庫
5.gem install cocoapods --pre :更新Cocoapods
6.pod env :查看已經(jīng)安裝的cocoapods版本
7.pod outdated :查看Podfile文件中的依賴庫的最新版本
六、Cocoapods使用過程中遇到的問題以及錯誤ERROR(持續(xù)更新)
1.[!] Invalid `Podfile` file: syntax error, unexpected end, expecting end-of-input
解決方案:這是因為你Podfile文件內(nèi)容輸入錯誤,好好檢查一下吧~
2.Specs satisfying the `Kingfisher (~> 5.13.3)` dependency were found, but they required a higher minimum deployment target.
解決方案:原因是因為三方庫本身支持最低版本是10.0,而我設(shè)置了8.0因此報錯
3.[!] Unable to find a specification for `XXX`You have either: * out-of-date source repos which you can update with `pod repo update` or with `pod install --repo-update`.* mistyped the name or version.* not added the source repo that hosts the Podspec to your Podfile.
解決方案:由于本地repo中沒有該庫或者該版本導(dǎo)致的,執(zhí)行pod repo update即可,你會發(fā)現(xiàn)pod repo update真的很慢,加快速的就是更新某個庫pod repo update后拼接庫的路徑即可XXX.podspec.json(例如:repo update ~/.cocoapods/repos//master/Specs)
七、Cocoapods相關(guān)知識點(持續(xù)更新)
- 1.pod install 和 pod update的區(qū)別以及使用場景:
pod install:會去檢查podfile.lock是否已經(jīng)包含該庫,如果包含則繼續(xù)判斷是否指定版本,如果指定版本就去檢查podfile.lock中保存的版本是否與新指定的相同,相同則跳過,不相同則更新,如果沒有指定版本則不檢查更新直接跳過,如果不包含該庫則去下載該庫并將版本保存在podfile.lock文件中。每次當pod install 命令運行,并下載安裝新的pods的時候,他會在Podfile.lock中為每個pod寫入它安裝的版本。此文件跟蹤每一個已安裝的版本,并且鎖定這些版本。當運行pod install 的時候它僅僅解析那些Podfile.lock中位列出的依賴關(guān)系。對于Podfile.lock中列出的pods,它僅僅會下載指明的版本,不會去檢查是否有新版本可用。對于Podfile.lock中未列出的pods,他會搜索與Podfile中內(nèi)容相匹配的版本 (例如 pod 'MyPod', '~>1.2')。
pod update:這個命令會忽略Podfile.lock中的記錄,直接去找符合Podfile文件中的該依賴庫的約束版本(無約束的話就是最新版本)。一般在你想要更新pods到一個新的版本的時候使用。當運行pod update PODNAME時,CocoaPods將嘗試查找PODNAME的更新版本,而不考慮Podfile.lock中列出的版本。 它會將pod更新為可能的最新版本(只要它與Podfile中的版本限制相匹配)。如果運行pod更新沒有pod名稱,CocoaPods將更新您Podfile中列出的每個pod到最新的版本。
pod install使用場景:
a.新創(chuàng)建工程,第一次引入pod庫時
b.修改了Podfile文件,添加或刪除了所依賴的pod庫時。
c.團隊中新人拉取工程后獲取pod庫時。
d.團隊中,不同開發(fā)者要同步對pod庫的依賴時(有人改變了依賴關(guān)系,刪除或增加pod時。還有就是有人執(zhí)行了pod update,此時他的Podfile.lock文件中的跟蹤版本就已經(jīng)變更,此時,其他人只要pod install就能更新為和Podfile.lock文件中的版本。還有就是如果Podfile和Podfile.lock的記錄相沖突,Podfile文件中指定了低于Podfile.lock中記錄的版本。會以Podfile文件為準,并在獲取成功后更新Podfile.lock文件。)
pod update使用場景:
a.一般在你想要更新pods到一個新的版本的時候使用。
- 2.podfile指定版本號時的邏輯運算符
Besides no version, or a specific one, it is also possible touse logical operators:
'> 0.1' Any version higher than 0.1 0.1以上
'>= 0.1' Version 0.1 and any higher version 0.1以上,包括0.1
'< 0.1' Any version lower than 0.1 0.1以下
'<= 0.1' Version 0.1 and any lower version 0.1以下,包括0.1
In addition to the logic operators CocoaPods has an optimisicoperator ~>:
'~> 0.1.2' Version 0.1.2 and the versions up to 0.2, not including 0.2 and higher 0.2以下(不含0.2),0.1.2以上(含0.1.2)
'~> 0.1' Version 0.1 and the versions up to 1.0, not including 1.0 and higher 1.0以下(不含1.0),0.1以上(含0.1)
'~> 0' Version 0 and higher, this is basically the same as not having it. 0和以上,等于沒有此約束
- 3.Podfile.lock
a.Podfile.lock這個文件是我們新建Podfile文件后會自動生成的一個文件,里面存儲了我們已經(jīng)安裝的依賴庫的版本。
b.當我們第一次運行Podfile時,如果對依賴庫不指定版本的話,cocoapods會安裝最新的版本,同時將pods的版本記錄在Podfile.lock文件中。這個文件會保持對每個pod已安裝版本的跟蹤,并且鎖定這些版本。再執(zhí)行pod install的話,只會處理沒有記錄在Podfile.lock中的依賴庫,會查找匹配Podfile中描述的版本。對于已經(jīng)記錄在Podfile.lock的依賴庫,會下載Podfile.lock文件中記錄的版本,而不會檢查是否有更新。當然,如果你約束了pods的版本的話,會按照你指定的版本進行安裝,同時也會更新Podfile.lock記錄的信息。
c.Podfile.lock內(nèi)部
PODS:
- Masonry (1.1.0)
DEPENDENCIES:
- Masonry (~> 1.1.0)
SPEC REPOS:
trunk:
- Masonry
SPEC CHECKSUMS:
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
PODFILE CHECKSUM: 7a5a6c829f4d2252e3e3d116ab9757a3b270ed8a
COCOAPODS: 1.9.3
4.Cocoapods原理
是將所有的依賴庫都放到另一個名為Pods的項目中, 然而讓主項目依賴Pods項目,這樣,源碼管理工作任務(wù)從主項目移到了Pods項目中.
a.Pods項目最終會編譯成一個名為libPods.a的文件, 主項目只要依賴這個.a文件即可.
b.對于資源文件, CocoaPods提供了一個名為Pods-resources.sh的bash腳步, 該腳本在每次項目, 編譯的時候都會執(zhí)行,將第三方庫的各種資源文件復(fù)制到目標目錄中.
c.CocoaPods通過一個名為Pods.xcconfig的文件在編譯設(shè)置所有的依賴和參數(shù)5.Cocoapods下載原理
s.source = { :git => 'git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git', :tag => '1.0.0' }
當使用Cocoapods導(dǎo)入私有庫時,Cocoapods先是根據(jù):git => ‘git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git’找到對應(yīng)的git倉庫,然后根據(jù):tag => ‘1.0.0’定位到對應(yīng)tag的提交(如果沒有注明Pod依賴庫版本則定位到最后一次的提交),然后在這次提交中檢索綴為.podspec的文件(文件可以隨便命名)。找到podspec文件后先要驗證s.name是否與Podfile中的一致,如果不一致則install時會報錯:[!]Unable to find a specification for ‘React’.驗證成功后,就會根據(jù)Podspec中的s.source_files找到需要導(dǎo)入的代碼文件,并通過其他的的數(shù)據(jù)找到對應(yīng)的配置文件或資源文件等。最后,將其下載到本地項目中。如果是共有庫,這些原理也相同。只是共有庫要將podspec文件上傳到cocoapods。在導(dǎo)入的時候通過名字React去cocoapods匹配對應(yīng)的podspec,然后根據(jù)s.source去找到對應(yīng)的倉庫和對應(yīng)的版本,然后會再去匹配新的podspec,后邊的步驟就完全相同了。6.Cocoapods集成原理
當所有的依賴庫都下載完后,Cocoapods會將所有的依賴庫都放到另一個名為Pods的項目中,然后讓主項目依賴Pods項目。這樣,源碼管理工作都從主目錄移到了Pods項目中。Pods項目最終會編譯成為一個名為libPods.a的文件,主項目只要依賴這個.a文件即可。對于資源文件,Cocoapods提供了一個名為Pods-resource.sh的bash腳本,該腳本在每次項目編譯的時候都會執(zhí)行,將Pods依賴庫的各種資源文件復(fù)制到目標目錄中。Cocoapods還通過一個名為Pods.xcconfig的文件來在編譯時設(shè)置所有的依賴和參數(shù)。7.Cocoapods版本控制原理
當執(zhí)行完pod install之后,cocoapods會生成一個podfile.lock的文件。podfile.lock文件最大的用處在于多人開發(fā)。如果你沒有在podfile中指定pods版本pod ‘React’,那么默認為獲取當前React依賴庫的最新版本。當團隊中的某個人執(zhí)行完pod install命令后,生產(chǎn)的podfile.lock文件就記錄下了當時最新pods依賴庫的版本,這時團隊中的其他人check下來這份包含podfile.lock文件的工程以后,再去執(zhí)行pod install命令時,獲取下來的pods依賴庫的版本和最開始用戶獲取到的版本一致。如果沒有podfile.lock文件,后續(xù)所有用戶執(zhí)行pod install命令都會獲取最新版本的React,這就可能造成一個團隊使用的依賴庫版本不一致,這對團隊協(xié)作來說絕對是個災(zāi)難。在這種情況下,如果團隊想使用當前最新版本的React依賴庫,有兩種方案:1、更改podfile,使其指向最新版本的React依賴庫 2、執(zhí)行pod update命令;鑒于podfile.lock文件對團隊協(xié)作如此重要,所以應(yīng)該加入到版本控制里面。8.pod 管理的第三方庫有 MJExtension.Framework 和 SDWebImage.Framework, 如何在MJExtension的某個類中使用來自SDWebImage庫的類
a.在pod中 找到MJExtension, 在Build Phases 中 導(dǎo)入SDWebImage.Framework
b.在pod的MJExtension.Framework 中, 找到Build Settings 配置Framework Search Paths 的 Debug 和 Release, 添加PODS_CONFIGURATION_BUILD_DIR/SDWebImage"
c.在pod的MJExtension.xcconfig中 添加 : FRAMEWORK_SEARCH_PATHS =PODS_CONFIGURATION_BUILD_DIR/SDWebImage"
9.指定repo鏡像
pod repo remove master
pod repo add master https://gitee.com/mirrors/CocoaPods-Specs (gitee鏡像)
pod repo update
pod repo remove master
pod repo add master https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git (清華鏡像)
pod repo update
source 'https://gitee.com/mirrors/CocoaPods-Specs.git'
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
參考文章:
IOS基礎(chǔ)知識-CocoaPods原理篇
好文章:
CocoaPods