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