使用CocoaPods也有很長一段時(shí)間了见秽,最近幾個(gè)月的時(shí)間里也主導(dǎo)了公司私有Pods的創(chuàng)建和使用菜谣。在此期間踩過了不少坑,在踩坑的過程中也收獲了不少經(jīng)驗(yàn)崩溪,更加熟練地掌握了CocoaPods的一些指令的使用。本篇作為這段時(shí)間收獲的備忘斩松。
一伶唯、CocoaPods簡介
CocoaPods是專門為iOS工程提供第三方依賴庫的管理工具,通過CocoaPods惧盹,我們可以更方便地管理每個(gè)第三方庫的版本乳幸,而且不需要我們做太多的配置,就可以直觀钧椰、集中和自動(dòng)化地管理我們項(xiàng)目的第三方庫粹断。
CocoaPods將所有依賴的庫都放在一個(gè)名為Pods的項(xiàng)目下,然后讓主項(xiàng)目依賴Pods項(xiàng)目嫡霞。然后瓶埋,我們編碼工作都從主項(xiàng)目轉(zhuǎn)移到Pods項(xiàng)目。Pods項(xiàng)目最終會(huì)編譯為一個(gè)libPod-項(xiàng)目名.a靜態(tài)庫诊沪,主項(xiàng)目依賴于這個(gè)靜態(tài)庫养筒。
對于資源文件,CocoaPods 提供了一個(gè)名為 Pods-resources.sh 的 bash 腳本端姚,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行晕粪,將第三方庫的各種資源文件復(fù)制到目標(biāo)目錄中。
CocoaPods 通過一個(gè)名為 Pods.xcconfig 的文件來在編譯時(shí)設(shè)置所有的依賴和參數(shù)渐裸。
CocoaPods是用 Ruby 寫的巫湘,并由若干個(gè) Ruby 包 (gems) 構(gòu)成的。在解析整合過程中昏鹃,最重要的幾個(gè) gems 分別是: CocoaPods/CocoaPods, CocoaPods/Core, 和 CocoaPods/Xcodeproj尚氛。
CocoaPod的核心組件
CocoaPods/CocoaPod
這是一個(gè)面向用戶的組件,每當(dāng)執(zhí)行一個(gè) pod 命令時(shí)盆顾,這個(gè)組件都將被激活怠褐。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調(diào)用所有其它的 gems 來執(zhí)行任務(wù)您宪。CocoaPods/Core
Core 組件提供支持與 CocoaPods 相關(guān)文件的處理奈懒,文件主要是 Podfile 和 podspecs。Podfile
Podfile 是一個(gè)文件宪巨,用于定義項(xiàng)目所需要使用的第三方庫磷杏。該文件支持高度定制,你可以根據(jù)個(gè)人喜好對其做出定制捏卓。更多相關(guān)信息极祸,請查閱 Podfile 指南慈格。Podspec
.podspec 也是一個(gè)文件,該文件描述了一個(gè)庫是怎樣被添加到工程中的遥金。它支持的功能有:列出源文件浴捆、framework、編譯選項(xiàng)和某個(gè)庫所需要的依賴等稿械。CocoaPods/Xcodeproj
這個(gè) gem 組件負(fù)責(zé)所有工程文件的整合选泻。它能夠創(chuàng)建并修改 .xcodeproj 和 .xcworkspace 文件。它也可以作為單獨(dú)的一個(gè) gem 包使用美莫。如果你想要寫一個(gè)腳本來方便地修改工程文件页眯,那么可以使用這個(gè) gem。
CocoaPods的安裝和配置厢呵,以及Podfile中第三方庫引用的語法規(guī)則(特別是版本號的語法格式)這里就不贅述了窝撵,下面挑重點(diǎn)講一講。
二襟铭、多target時(shí)Podfile該如何寫碌奉?
我的建議是使用Ruby語法,定義不同的分組寒砖,然后不同的target可以自由選擇依賴哪些分組道批,這種方式看起來更簡潔,對于多target的項(xiàng)目來說也更友好:
platform :ios, '8.0'
def commonPods #通用pods集
pod 'AFNetworking', '~> 2.0'
pod 'Masonry'
end
def appOnlyPods #app專用pods集
pod 'MBProgressHUD'
end
def extensionPods #擴(kuò)展專用pods集
pod 'GTSDKExtension'
end
target :TestCocoaPods do
commonPods
appOnlyPods
target :TestCocoaPodsTests do
inherit! :search_paths
# Pods for testing
end
target :TestCocoaPodsUITests do
inherit! :search_paths
# Pods for testing
end
end
target :SecondTarget do
commonPods
end
三入撒、如何忽略Pods警告?
有些第三方Pod集成進(jìn)來會(huì)有一大堆警告信息椭岩,如果你看著比較難受想把它忽略的話茅逮,在Podfile中對應(yīng)的target或分組下加上關(guān)鍵字inhibit_all_warnings
即可。
四判哥、如何直接引用第三方庫中的頭文件献雅?
在用CocoaPods集成第三方庫之后,默認(rèn)情況下塌计,我們需要使用類似#import <XXX/YYY.h>
的方式引入第三方庫的頭文件挺身。我們可以在Build Settings -> User Header Search Paths中添加${SRCROOT}
并設(shè)置成recursive,這樣我們就可以直接使用#impot "YYY.h"
這種方式了锌仅。
五章钾、pod install
or pod update
?
如官方文檔所說,pod install
和 pod update
確實(shí)是大家最容易搞混的兩條指令热芹,很多人還沒搞清楚這兩條指令的區(qū)別贱傀,反正不管三七二十一上來就是一個(gè)pod update
,大家一定要搞清楚這兩條指令的區(qū)別伊脓。
按照官方文檔所說府寒,pod install
在第一次檢索集成第三方以及每一次在Podfile中新增、更改或刪除pod的時(shí)候使用。每一次執(zhí)行pod install
命令株搔,它都會(huì)下載安裝新的pod剖淀,并且會(huì)把每一個(gè)安裝的pod的版本信息寫入Podfile.lock文件。Podfile.lock文件跟蹤每一個(gè)安裝的pod的版本并且上鎖纤房。每一次執(zhí)行pod install
命令纵隔,只解決還沒有在Podfile.lock中列出的依賴:對于已在Podfile.lock中列出的pod,會(huì)下載指定的版本帆卓,不會(huì)檢查是否有新版本巨朦。對于沒有在Podfile.lock中列出的pod,它會(huì)搜索并安裝Podfile中指定的版本剑令。
直接執(zhí)行pod update
命令會(huì)檢查安裝Podfile中列出的所有pod的新版本(往往比較慢)糊啡。
執(zhí)行pod update PODNAME
命令會(huì)檢查PODNAME的新版本(不考慮Podfile.lock中記錄的版本信息),它會(huì)把PODNAME更新為最新版本吁津,只要跟Podfile中指定的版本匹配棚蓄。也就是說,pod update PODNAME
將PODNAME更新到Podfile中指定的版本碍脏,可以是更新到老版本也可以是更新到新版本梭依,取決于Podfile。(比如:如果此時(shí)Podfile中指定了pod 'AFNetworking', '~> 2.0'
典尾,此時(shí)執(zhí)行pod update AFNetworking
并不會(huì)把AFNetworking更新到最新版本(因?yàn)榇藭r(shí)的版本滿足大于等于2.0版)役拴,必須先修改Podfile中的版本信息才會(huì)更新到指定版本)。
兩者的區(qū)別:
用
pod install
命令來安裝新的pod钾埂,每次在Podfile中新增和刪除pod都使用pod install
命令河闰。在Podfile中添加新的pod后應(yīng)該用
pod install
命令,而不是pod update
命令褥紫。通過pod install
命令安裝新的pod而不用擔(dān)心在同一進(jìn)程中修改已有的pod姜性。pod update
命令僅用在更新指定pod到指定版本或者更新所有pod。
我的建議是:該用pod install
的時(shí)候不要用pod update PODNAME
髓考。另外部念,盡量不要用pod update
,因?yàn)樗侨繖z查一遍氨菇,不僅慢有時(shí)候還會(huì)出現(xiàn)坑儡炼。比如有一個(gè)依賴的第三方庫本來是2.0版本的用的好好的,因?yàn)樗菄獾馁Y源门驾,下載起來非常慢射赛,我們在沒有bug的情況下是不希望輕易去更新它的,那么如果你上來就是一個(gè)pod update
指令奶是,OK楣责, 如果你Podfile中指定了每次使用最新版本(不指定版本號)竣灌,那么CocoaPods就會(huì)去下載最新的這個(gè)第三方庫,那在下載完成之前你還要不要做其他事情了秆麸?這還是情況好的初嘹,如果這個(gè)最新的版本一直下載失敗,所以一直集成失敗怎么辦沮趣?
六屯烦、如何創(chuàng)建私有Pod?
要?jiǎng)?chuàng)建私有Pod房铭,首先我們需要兩個(gè)私有倉庫驻龟,一個(gè)放私有Pod源碼,一個(gè)放私有Pod的說明書(類似公有Pod的CocoaPods/Specs)缸匪。
1翁狐、添加私有Spec倉庫到本地
pod repo add privateSpecs your_privateSpecs.git
如果執(zhí)行成功,之后便可以通過pod repo list
命令查看本地Spec倉庫列表凌蔬,正常情況下會(huì)有一個(gè)公有的CocoaPods官方的master repo 和你的 privateSpecs repo露懒,并可以看到它們在本地的存放路徑(其實(shí)在~/.cocoapods/repos
目錄下)。
2砂心、創(chuàng)建私有Pod
在私有Pod代碼所在文件夾下執(zhí)行pod spec create your_podName
在該目錄下創(chuàng)建一個(gè)your_podName.podspec說明書文件懈词。之后的工作就是編輯這個(gè)說明書文件了,這里簡單注明一下規(guī)則:
Pod::Spec.new do |s|
s.name = "ATCategory"
s.version = "0.0.1"
s.summary = "共用擴(kuò)展類集合"
s.description = <<-DESC
大家如果需要用到擴(kuò)展辩诞,都使用這里已有的擴(kuò)展啦坎弯。
DESC
s.homepage = "your_privatePodGit_address/ATCategory"
s.author = { "ApesTalk" => "https://github.com/apestalk" }
s.platform = :ios
s.platform = :ios, "8.0"
s.source = { :git => "your_privatePodGit_address", :tag => "#{s.version}"
# 如果你有多個(gè)私有Pod放在一個(gè)倉庫里,你可以修改tag像下面這樣译暂,對應(yīng)打tag的時(shí)候的規(guī)則就對應(yīng)需要變成PodName-v0.0.1這樣子了
# s.source = { :git => "your_privatePodGit_address", :tag => s.name + "-v"+"#{s.version}"
}
s.source_files = 'ATCategory/**/*'
s.public_header_files = 'ATCategory/Category/*.h'
s.requires_arc = true
s.frameworks = 'UIKit','Foundation'
# 依賴的系統(tǒng)library荞怒,這里是指系統(tǒng)的類似libz.tbd、libxml2.tbd這類的系統(tǒng)庫
# s.library = 'z' // 單個(gè)
# s.libraries = 'z','xml2' // 多個(gè)
# 第三方.a
# s.vendored_libraries =
# 第三方frameworks文件
# s.vendored_frameworks =
# 依賴關(guān)系秧秉,該項(xiàng)目所依賴的其他庫,如果有多個(gè)需要填寫多個(gè)s.dependency
# s.dependency 'AFNetworking', '~> 2.3'
# 資源文件地址
# s.resource_bundles = {
# 'ATCategory' => ['ATCategory/Images/*.png']
# }
end
3衰抑、提交源代碼并打tag
注意這里tag必須跟podspec文件中的tag保持一致象迎,因?yàn)镃ocoaPods是通過podspec文件中的tag去找源文件的,如果tag對應(yīng)不起來就會(huì)驗(yàn)證失敗呛踊。打好tag提交到遠(yuǎn)端砾淌。
4、驗(yàn)證podspec文件合法性和可選參數(shù)
有兩種驗(yàn)證方式谭网,一種是本地驗(yàn)證pod lib lint your_podName.podspec
和聯(lián)網(wǎng)驗(yàn)證pod spec lint your_podName.podspec
汪厨。建議大家都用聯(lián)網(wǎng)驗(yàn)證。
這里可選參數(shù)有:
-
--allow-warnings
:允許警告 -
--sources=‘master,privateSpecs
:指定源愉择,比如你的私有pod同時(shí)依賴了公有庫和私有庫劫乱,你必須指定源才行织中,因?yàn)槟J(rèn)只會(huì)去在公有源中查找對應(yīng)的依賴 -
--use-libraries
:如果使用了靜態(tài)庫,記得加上它
5衷戈、提交說明書文件到私有說明書庫
pod repo push privateSpecs your_podName.podspec
狭吼,同樣的加上上面驗(yàn)證時(shí)使用到的可選參數(shù)。
6殖妇、如何使用素材刁笙?
官方建議pod中的素材用bundle的形式避免和主項(xiàng)目中的文件名發(fā)生沖突,那么集成后我們?nèi)绾问褂胋undle中的素材呢谦趣?
NSBundle *bundle = [NSBundle mainBundle];
//NSBundle *bundle = [NSBundle bundleForClass:[ClassFromPodspec class]];//對于靜態(tài)庫疲吸,拿到的是mainBundle,如果是動(dòng)態(tài)庫前鹅,拿到的是類所在的bundle摘悴。使用動(dòng)態(tài)庫需要在Podfile中開啟use_frameworks!
NSURL *wttpodBundleURL = [bundle URLForResource:@"WTTPod" withExtension:@"bundle"];
NSBundle *wttpodBundle = [NSBundle bundleWithURL: wttpodBundleURL];
UIImage *img = [UIImage imageNamed:@"Chat_checkin_empty_stu" inBundle:wttpodBundle compatibleWithTraitCollection:nil];
7、關(guān)于subspec
如果我們的pod中文件比較多嫡纠,而我們又希望能像AFNetworking那樣集成后分幾個(gè)物理文件夾(默認(rèn)會(huì)把所有文件都放在一個(gè)物理文件夾下烦租,文件太多會(huì)顯得很亂),那么就要用到subspec來把我們的pod分成幾個(gè)獨(dú)立的子模塊除盏。
s.subspec '子模塊名稱' do |別名叉橱,不能和子模塊名稱相同,比如ss|
ss.source_files = ''
end
具體怎么用者蠕,大家可以參考AFNetworking.podspec文件中的寫法窃祝。
七、如何使用私有庫
如果我們同時(shí)使用了公有庫和私有庫踱侣,我們只需要在Podfile的頭部同時(shí)把公有庫和私有庫的source加上即可粪小。
八、pod search
搜不到私有庫抡句?或者搜得到pod install
失斕讲病?
在提交私有庫說明書之后待榔,先執(zhí)行一下pod repo update privateSpecs
逞壁,然后再集成。
九锐锣、集成某一個(gè)pod速度過慢腌闯,比如MobileVLCKit總是下載失敗
把對應(yīng)版本的MobileVLCKit下載下來放在訪問速度更快的地方(比如內(nèi)網(wǎng)服務(wù)器或者本機(jī)用Python開啟一個(gè)FTP服務(wù))在本機(jī)master repo源中搜索找到對應(yīng)版本的MobileVLCKit.podspec.json文件,把其中的source改成我們存放MobileVLCKit.tar.xz文件地址雕憔,之后再執(zhí)行相關(guān)指令集成姿骏。
如何利用Python開啟一個(gè)本地FTP服務(wù):
cd到要共享的目錄下,執(zhí)行python -m SimpleHTTPServer 8000
斤彼,之后同一個(gè)局域網(wǎng)內(nèi)就可以通過本機(jī)ip:8000
訪問到該共享文件夾了分瘦。
"http":"http://192.168.210.111:8000/MobileVLCKit-3.1.2-bf58e19-37855b857a.tar.xz"
獲取本機(jī)IP地址的方法:按住Option的同時(shí)點(diǎn)下Mac菜單欄的無線網(wǎng)Icon蘸泻,在下拉列表中即可看到IP地址。也可以在終端中輸入ifconfig en0
命令查看擅腰。
十蟋恬、驗(yàn)證podspec時(shí),報(bào)錯(cuò) symbol(s) not found for architecture i386
檢查一下是否私有Pod中使用到的什么文件不支持i386架構(gòu)趁冈,比如什么.a文件歼争。
解決辦法:在podspec文件中指定支持的架構(gòu)
valid_archs = ['armv7s','arm64',]
s.xcconfig = {
'VALID_ARCHS' => valid_archs.join(' '),
}
s.pod_target_xcconfig = {
'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
}
同樣的,如果在驗(yàn)證過程中遇到xcodebuild: Returned an unsuccessful exit code.卻不報(bào)具體的錯(cuò)渗勘,去看看NOTE類型的信息沐绒,如果看到missing required architecture i386 in file此類消息,說明某個(gè).a或者frawork不支持i386架構(gòu)旺坠,需要在podspec文件中寫明該pod支持哪些架構(gòu)乔遮。
十一、pod init
失斎∪小蹋肮?
用Xcode9.4.1新建一個(gè)項(xiàng)目,然后執(zhí)行pod init
(Cocoapods1.4.0版本)時(shí)提示失敗璧疗,錯(cuò)誤提示如下:
――― MARKDOWN TEMPLATE ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
### Command
/usr/local/Cellar/cocoapods/1.4.0/libexec/bin/pod init
### Report
* What did you do?
* What did you expect to happen?
* What happened instead?
### Stack
CocoaPods : 1.4.0
Ruby : ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
RubyGems : 2.5.2
Host : Mac OS X 10.13.3 (17D47)
Xcode : 9.4.1 (9F2000)
Git : git version 2.15.2 (Apple Git-101.1)
Ruby lib dir : /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib
### Plugins
cocoapods-deintegrate : 1.0.2
cocoapods-plugins : 1.0.0
cocoapods-search : 1.0.0
cocoapods-stats : 1.0.0
cocoapods-trunk : 1.3.0
cocoapods-try : 1.1.0
### Error
RuntimeError - [Xcodeproj] Unknown object version.
/usr/local/Cellar/cocoapods/1.4.0/libexec/gems/xcodeproj-1.5.4/lib/xcodeproj/project.rb:217:in `initialize_from_file'
/usr/local/Cellar/cocoapods/1.4.0/libexec/gems/xcodeproj-1.5.4/lib/xcodeproj/project.rb:102:in `open'
/usr/local/Cellar/cocoapods/1.4.0/libexec/gems/cocoapods-1.4.0/lib/cocoapods/command/init.rb:41:in `validate!'
/Library/Ruby/Gems/2.3.0/gems/claide-1.0.2/lib/claide/command.rb:333:in `run'
/usr/local/Cellar/cocoapods/1.4.0/libexec/gems/cocoapods-1.4.0/lib/cocoapods/command.rb:52:in `run'
/usr/local/Cellar/cocoapods/1.4.0/libexec/gems/cocoapods-1.4.0/bin/pod:55:in `<top (required)>'
/usr/local/Cellar/cocoapods/1.4.0/libexec/bin/pod:22:in `load'
/usr/local/Cellar/cocoapods/1.4.0/libexec/bin/pod:22:in `<main>'
――― TEMPLATE END ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
[!] Oh no, an error occurred.
Search for existing GitHub issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=%5BXcodeproj%5D+Unknown+object+version.&type=Issues
If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new
Be sure to first read the contributing guide for details on how to properly submit a ticket:
https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md
Don't forget to anonymize any private data!
Looking for related issues on cocoapods/cocoapods...
- Pod Update: RuntimeError - [Xcodeproj] Unknown object version. Xcode Beta 5
https://github.com/CocoaPods/CocoaPods/issues/8003 [closed] [17 comments]
a day ago
- RuntimeError - [Xcodeproj] Unknown object version.
https://github.com/CocoaPods/CocoaPods/issues/7697 [closed] [28 comments]
3 weeks ago
- Pod init. Unknown object version
https://github.com/CocoaPods/CocoaPods/issues/7907 [closed] [2 comments]
03 Jul 2018
and 42 more at:
https://github.com/cocoapods/cocoapods/search?q=[Xcodeproj]%20Unknown%20object%20version.&type=Issues&utf8=?
這種失敗原因是Cocoapods和xcodeproj版本兼容問題坯辩。
嘗試了網(wǎng)上的解決辦法Run gem install xcodeproj:1.4.1,依然失敗崩侠。
解決辦法:打開項(xiàng)目漆魔,在Project Document下將Project Format從Xcode 9.3-compatible修改為Xcode 8.0-compatible即可。
十二却音、在pod中引入項(xiàng)目文件報(bào)錯(cuò)(file not found)
在開發(fā)中有時(shí)候需要在pod中import項(xiàng)目中的文件進(jìn)行調(diào)試或測試(當(dāng)然這種情況比較少見)改抡,但是當(dāng)你輸入import的時(shí)候會(huì)發(fā)現(xiàn)系統(tǒng)根本沒法聯(lián)想到你想用的項(xiàng)目中的文件,即使你手動(dòng)寫入系瓢,也會(huì)報(bào)file not found的錯(cuò)誤阿纤。
此時(shí),可以在我們的Pods項(xiàng)目中的Build settings下找到 User Header Search Paths夷陋,添加一行阵赠,并設(shè)置$(SRCROOT)/..
為recursive。注意有/..
肌稻,意思是在上級目錄下遞歸查找文件。
十三匕荸、清除本地緩存(version重用)
如果在某個(gè)tag下(假設(shè)WTTestPodCache-v0.0.1)驗(yàn)證私有pod失敗爹谭,修改代碼后,我們還希望使用這個(gè)版本號而不是去修改podspec文件中的version字段榛搔。我們就需要清除Pod的本地緩存了诺凡,否則會(huì)因?yàn)樵搕ag對應(yīng)的緩存問題东揣,還是一樣驗(yàn)證不過。這時(shí)候我們需要先把代碼修改正確后提交腹泌,然后把本地和遠(yuǎn)程的原tag刪除嘶卧,最后在最新代碼節(jié)點(diǎn)上打一個(gè)相同的tag提交再次提交驗(yàn)證。---參考:CocoaPods清理本地緩存
我們在驗(yàn)證的時(shí)候加上--verbose參數(shù)凉袱,會(huì)看到CocoaPods有如下拷貝操作:
copying XXX from 后面跟著的就是本地緩存的地址芥吟,進(jìn)入該路徑下會(huì)看到WTTestPodCache,我們刪除本地和遠(yuǎn)程tag后专甩,本地該緩存依然存在钟鸵,當(dāng)執(zhí)行pod cache clean WTTestPodCache
后,本地該緩存就不存在了涤躲,在驗(yàn)證私有Pod時(shí)CocoaPods就會(huì)嘗試再次從遠(yuǎn)程拉取棺耍。
查看本地緩存列表
pod cache list
清除本地緩存
pod cache clean XXX
十四、集成MobileVLCKit時(shí)報(bào)錯(cuò)Lzma library error
如果在驗(yàn)證pod种樱,安裝某個(gè)庫時(shí)報(bào)Lzma庫的錯(cuò)誤:
ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/tar xf /var/folders/tf/jlbz0pq91m16571fgc7ywbk80000gn/T/d20191016-38557-1l50cyi/file.txz -C /var/folders/tf/jlbz0pq91m16571fgc7ywbk80000gn/T/d20191016-38557-1l50cyi
MobileVLCKit-binary/MobileVLCKit.framework/MobileVLCKit: Lzma library error: No progress is possible
tar: Error exit delayed from previous errors.
這屬于pod依賴的這個(gè)庫的壓縮包解壓失敗了蒙袍,Lzma library是用來解壓用的,如果壓縮包損壞了嫩挤,會(huì)導(dǎo)致解壓失敗害幅,從而報(bào)這個(gè)錯(cuò)誤,此時(shí)需要檢查壓縮包是否正常俐镐。
十五矫限、本地多個(gè)Ruby環(huán)境導(dǎo)致pod執(zhí)行失敗
如果執(zhí)行任意pod指令都失敗,失敗信息像下面這樣:
Ignoring ffi-1.13.1 because its extensions are not built. try: gem pristine ffi —version 1.13.1
Ignoring gem-wrappers-1.4.0 because its extensions are not builts. Try: gem pristine gem-wrappers —version 1.4.0
Traceback (most recent call last):
23: from /USR/LOCAL/BIN/pod:23:in `<main>`
22: from /USR/LOCAL/BIN/pod:23:in `load`
21: from /Users/username/.rvm/rubies/ruby-2.6.0/lib/ruby/gems/2.6.0/gems/cocoapods-1.9.3/bin/pod:36:in `<top (required)>`
20: from /System/Library/Frameworks/Ruby.frameworks/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require`
如果是這樣子的話佩抹,根據(jù)錯(cuò)誤提示說明是本地有多個(gè)Ruby環(huán)境導(dǎo)致的叼风,應(yīng)該是中途什么時(shí)候看了一些教程安裝了rvm然后又裝了個(gè)Ruby,刪除rvm目錄下的Ruby即可棍苹。
十六无宿、慎用--skip-import-validation與--skip-tests
如果pod怎么都驗(yàn)證不過,始終只有這么一條提示([iOS] xcodebuild: Returned an unsuccessful exit code)枢里,沒有任何其他ERROR信息孽鸡,可以加上這兩個(gè)選項(xiàng)了讓pod驗(yàn)證通過。
--skip-tests: 在驗(yàn)證期間跳過構(gòu)建和運(yùn)行測試
--skip-import-validation: 跳過驗(yàn)證pod是否可以導(dǎo)入