/** 寫在前面,我是新手經(jīng)驗(yàn)和知識(shí)量還不夠,有些理解和解釋有bug,我自己都不知道哈哈。辯證的看哦 **/
來我司之后,第一天搭建生產(chǎn)環(huán)境遇到,就是被CocoaPods坑了。
生產(chǎn)環(huán)境是這樣:os x Yosemite 10.10.3 ruby 2.0.0p481 CocoaPods 0.57.2
問題1描述:
diff: /../Podfile.lock: No such file or directory
diff: /Manifest.lock: No such file or directory error: The sandbox is not in sync with
the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
當(dāng)我pod install 項(xiàng)目之后,是可以生成Pods文件目錄,下載引用的frame。但是無法生成.xcworkspace文件,項(xiàng)目有之前編譯生存的.xcworkspace,刪除后發(fā)現(xiàn)pod install 無法生成新的。也沒有生成Podfile.lock文件,當(dāng)你打開.xcworkspace,發(fā)現(xiàn)會(huì)報(bào)錯(cuò)上面的3個(gè)錯(cuò)誤。google這些錯(cuò)誤,在stackoverflow 找到資料,給出解決方案如下:
1. 刪除工程文件夾下的Podfile、Podfile.lock及Pods文件夾
2. 刪除xcworkspace文件
3. 使用xcodeproj文件打開工程,刪除Frameworks組下的Pods.xcconfig及l(fā)ibPods.a引用
4. 在工程設(shè)置中的Build Phases下刪除Check Pods Manifest.lock及Copy Pods Resources
ps:如果將cocoapods集成到工程中后不小心修改或刪除了其相關(guān)文件導(dǎo)致無法便以通過例如:不小心把
Pods.xcconfig給刪除了然后出現(xiàn)diff: /../Podfile.lock: No such file or directory,用上面的方法刪除cocoapods后,
再重新$sudo pod install一下就好了。
但是我問題里面,出現(xiàn)找不到Podfile.lock文件,而且即使按照這個(gè)步驟來完成,問題也沒有解決。
再補(bǔ)充一點(diǎn),我司建議使用自己的repo spec鏡像。于是我按照指南先做來一步刪除cocoapods默認(rèn)指向github的repo
pod repo remove master
pod repo add master https://gitcafe.com/lloydsheng/Specs.git
-------------------------
名稱解釋:repo spec 是什么?
可以看這篇文章里面介紹什么是repo,如果制作自己的項(xiàng)目發(fā)布到cocoapods官方repo里面去。http://www.360doc.com/content/14/0309/10/11029609_358969425.shtml
我稍微解釋一下(2333 我也知道這么多哈),repo就是倉庫的意思,上面的master就是cocoapod 安裝后默認(rèn)的倉庫,這里面是list文件目錄,有所有官方維護(hù)的第三方庫如AFNetwork,SDWebImage。里面放的是特殊的框架說明文檔,你可以本地查看master目錄里面的內(nèi)容,命令如下:
cd ~/.cocoapods/repos/master 進(jìn)去后發(fā)現(xiàn)2個(gè)文件和一個(gè)目錄
CocoaPods-version.yml README.md Specs 然后進(jìn)入Specs 就可以看到官方維護(hù)的所有第三方庫。我找到AFNetworking,進(jìn)入目錄發(fā)現(xiàn)有0.10.0-2.4.0所有的版本,進(jìn)入2.4.0文件夾看到AFNetworking.podspec.json文件cat顯示一下,可以看到關(guān)鍵這個(gè)庫的介紹下載地址,{
"name": "AFNetworking",
"version": "2.0.3",
"license": "MIT",
"summary": "A delightful iOS and OS X networking framework.",
"homepage": "https://github.com/AFNetworking/AFNetworking",
"authors": {
"Mattt Thompson": "m@mattt.me"
},
"source": {
"git": "https://github.com/AFNetworking/AFNetworking.git",
"tag": "2.0.3",
"submodules": true
},
"requires_arc": true,
"platforms": {
"ios": "6.0",
"osx": "10.8"
},
對(duì)了,在Podfile文件里面寫上pod AFNetworking '2.4.0' 然后執(zhí)行pod install,就可以通過ruby環(huán)境把我們當(dāng)前項(xiàng)目生成xcworkspace文件,并下載AFNetworking框架。那么cocoapods是怎么找到AFNetworking的,就是到本地的repo master spec里面search查找到AFNetworking,然后解析他的說明文檔,找到github上的資源下載下來。目前官方的spec維護(hù)有執(zhí)行pod list 可以看到10824 pods were foun,有一萬多個(gè)庫。
我可以把自己的庫放到cocoapods里面去,上面的網(wǎng)址就是介紹如何安裝cocoapods規(guī)范fork他們的項(xiàng)目,提交你的庫到repo里面去。這樣別人就可以通過cocoapods引用你的庫了。前面提到我司建議刪除cocoapods默認(rèn)的master repo倉庫,給他指向我們自己的服務(wù)器鏡像。
好處是什么呢?github不穩(wěn)定,每次pod install 會(huì)clone下來1萬多個(gè)pod。而且不容易集成我司自己的私有庫,是的,我可以把自己的私有庫添加到pod里面。最簡(jiǎn)單方式,就是修改自己電腦上的master pod 按照規(guī)范添加一個(gè).podspec.json 你自己執(zhí)行就可以找到這個(gè)庫。為了更多貢獻(xiàn),建立服務(wù)器上私有pod 庫就更nice,維護(hù)同官方的庫版本,同時(shí)添加自己的私有庫。對(duì)了在Podfile文件里面可以指定我們matsr repo 資源從哪里引用。命令就是Podfile里面添加 source "xxxxxxxx.git" 如果本地repo沒有那么會(huì)clone下來,同于前面手動(dòng)執(zhí)行 pod repo add master "xxxxxxxx.git" 執(zhí)行后結(jié)果就是:Cloning spec repo `gitcafe-lloydsheng-specs` from `https://gitcafe.com/lloydsheng/Specs.git`
執(zhí)行pod repo list 可以看到你clone哪些spec,我司有好幾個(gè)specs,你發(fā)現(xiàn)有一個(gè)master,找了會(huì)資料沒有理解。哈哈,后來想明白了master就是默認(rèn)主repo意思,如果你的Podfile里面沒有指定source 那么就是master咯。(nice,這是我自己一些理解的)。
master
- Type: git (origin)
- URL: https://gitcafe.com/lloydsheng/Specs.git
- Path: /Users/jianyi/.cocoapods/repos/master
好了介紹了cocoapods原理和生產(chǎn)環(huán)境。
-----------------------
問題二:出現(xiàn)問題以后,我pull了線上的版本測(cè)試一下,之前是master主線。執(zhí)行pod install后,也出現(xiàn)了問題。[!] The 'xxx' target has frameworks with conflicting names: networkxxx.
每次pod install 安裝這里的時(shí)候就提示有framework 沖突了,按照log理解就是重復(fù)引用。但是podfile里面沒有重復(fù)的引入,其他同事沒有問題。因?yàn)槠渌旅χl(fā)版本,我剛來我先自己研究一下什么問題。當(dāng)時(shí)考慮到一下幾個(gè)方面:
是不是podfile引入了三個(gè) source repo,他們自己里面有沖突?#一次次屏蔽調(diào)試沒有問題,就是pod netwrokxxxx 處報(bào)錯(cuò)。百思不得其解,后來組長過來debug了一下,也不得其解,不過老鳥踩的坑比我多呀,建議我降低cocoapods版本到0.35.0,和他們環(huán)境一樣再install看看。
嗯,降低版本后,一次就install成功了,也就是說這次的framework沖突是cocoapods版本引起的。所以這里給大家一個(gè)思路,有時(shí)候檢查一下依賴的環(huán)境,也是解決問題的重要方法之一。
總結(jié):第一個(gè)問題,出現(xiàn)問題本質(zhì)是當(dāng)是我pull的是master版本,里面的podfile不完整引起的,造成沒有編譯生成新的.xcworkspace和Podfile.lock文件。所以,出現(xiàn)這樣問題解決辦法,刪除.xcworkspace,pod文件夾,Podfile.lock 如果可以生成新的.xcworkspace那么說明cocoapods編譯沒有問題。就不會(huì)出現(xiàn)diff: /../Podfile.lock: No such file or directory。報(bào)這個(gè)問題,因?yàn)?xcworkspace不是你pod install 自己生成的還是老項(xiàng)目留下的,他當(dāng)然找不到對(duì)應(yīng)的podfile.lock。
第二個(gè)問題,出現(xiàn)的問題就比較詭異,沒有經(jīng)驗(yàn)?zāi)X活著子一下子短路了的人會(huì)很慘。解決方案降低版本,或者你升級(jí)版本嘗試一下。
最后分享一下pod命令:
ruby --version 看當(dāng)前環(huán)境的ruby,大多數(shù)是建議切換換成淘寶的ruby鏡像
pod --version 看當(dāng)前cocoapods版本
pod repo list 查看你本地clone下來的specs,這樣pod update/isstall 會(huì)先從本地查找找?guī)斓馁Y源路徑的
pod repo remove master 剛剛說了,這是刪除cocoapods 默認(rèn)的specs
pod repo add master https://gitcafe.com/lloydsheng/Specs.git 指定自己的默認(rèn)spec
pod repo update 更新本地和服務(wù)器的repo 數(shù)據(jù)
cd ~/.cocoapods/ 環(huán)境目錄了 進(jìn)入看看有什么吧
cd ~/.cocoapods/repos/master/Specs/ 所有庫的規(guī)范文檔咯
-------------------
可見,我司用的是cocoapods,我自己使用就是pod完了,沒有使用說明source 指定repo。這次我就好好學(xué)習(xí),研究了一下pod 命令和怎么實(shí)現(xiàn)的機(jī)制?,F(xiàn)在明白來,如何維護(hù)私有repo,向官方添加自己的庫。nice,,,,,
至于升級(jí)后cocoapods改變了什么,導(dǎo)致報(bào)哪個(gè)沖突錯(cuò)誤呢?現(xiàn)在還沒有深入去考慮,目前的知識(shí)夠我工作,麻利的干活,看到pod相關(guān)的語句心里有數(shù)了。對(duì)cocoapods背后技術(shù)原理有了數(shù),遇事就不慌了。
聯(lián)系客服