/** 写在前面,我是新手经验和知识量还不够,有些理解和解释有bug,我自己都不知道哈哈。辩证的看哦 **/
来我司之后,第一天搭建生产环境遇到,就是被CocoaPods坑了。
生产环境是这样: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.
当我pod install 项目之后,是可以生成Pods文件目录,下载引用的frame。但是无法生成.xcworkspace文件,项目有之前编译生存的.xcworkspace,删除后发现pod install 无法生成新的。也没有生成Podfile.lock文件,当你打开.xcworkspace,发现会报错上面的3个错误。google这些错误,在stackoverflow 找到资料,给出解决方案如下:
1. 删除工程文件夹下的Podfile、Podfile.lock及Pods文件夹
2. 删除xcworkspace文件
3. 使用xcodeproj文件打开工程,删除Frameworks组下的Pods.xcconfig及libPods.a引用
4. 在工程设置中的Build Phases下删除Check Pods Manifest.lock及Copy Pods Resources
ps:如果将cocoapods集成到工程中后不小心修改或删除了其相关文件导致无法便以通过例如:不小心把
Pods.xcconfig给删除了然后出现diff: /../Podfile.lock: No such file or directory,用上面的方法删除cocoapods后,
再重新$sudo pod install一下就好了。
但是我问题里面,出现找不到Podfile.lock文件,而且即使按照这个步骤来完成,问题也没有解决。
再补充一点,我司建议使用自己的repo spec镜像。于是我按照指南先做来一步删除cocoapods默认指向github的repo
pod repo remove master
pod repo add master https://gitcafe.com/lloydsheng/Specs.git
-------------------------
名称解释:repo spec 是什么?
可以看这篇文章里面介绍什么是repo,如果制作自己的项目发布到cocoapods官方repo里面去。http://www.360doc.com/content/14/0309/10/11029609_358969425.shtml
我稍微解释一下(2333 我也知道这么多哈),repo就是仓库的意思,上面的master就是cocoapod 安装后默认的仓库,这里面是list文件目录,有所有官方维护的第三方库如AFNetwork,SDWebImage。里面放的是特殊的框架说明文档,你可以本地查看master目录里面的内容,命令如下:
cd ~/.cocoapods/repos/master 进去后发现2个文件和一个目录
CocoaPods-version.yml README.md Specs 然后进入Specs 就可以看到官方维护的所有第三方库。我找到AFNetworking,进入目录发现有0.10.0-2.4.0所有的版本,进入2.4.0文件夹看到AFNetworking.podspec.json文件cat显示一下,可以看到关键这个库的介绍下载地址,{
"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"
},
对了,在Podfile文件里面写上pod AFNetworking '2.4.0' 然后执行pod install,就可以通过ruby环境把我们当前项目生成xcworkspace文件,并下载AFNetworking框架。那么cocoapods是怎么找到AFNetworking的,就是到本地的repo master spec里面search查找到AFNetworking,然后解析他的说明文档,找到github上的资源下载下来。目前官方的spec维护有执行pod list 可以看到10824 pods were foun,有一万多个库。
我可以把自己的库放到cocoapods里面去,上面的网址就是介绍如何安装cocoapods规范fork他们的项目,提交你的库到repo里面去。这样别人就可以通过cocoapods引用你的库了。前面提到我司建议删除cocoapods默认的master repo仓库,给他指向我们自己的服务器镜像。
好处是什么呢?github不稳定,每次pod install 会clone下来1万多个pod。而且不容易集成我司自己的私有库,是的,我可以把自己的私有库添加到pod里面。最简单方式,就是修改自己电脑上的master pod 按照规范添加一个.podspec.json 你自己执行就可以找到这个库。为了更多贡献,建立服务器上私有pod 库就更nice,维护同官方的库版本,同时添加自己的私有库。对了在Podfile文件里面可以指定我们matsr repo 资源从哪里引用。命令就是Podfile里面添加 source "xxxxxxxx.git" 如果本地repo没有那么会clone下来,同于前面手动执行 pod repo add master "xxxxxxxx.git" 执行后结果就是:Cloning spec repo `gitcafe-lloydsheng-specs` from `https://gitcafe.com/lloydsheng/Specs.git`
执行pod repo list 可以看到你clone哪些spec,我司有好几个specs,你发现有一个master,找了会资料没有理解。哈哈,后来想明白了master就是默认主repo意思,如果你的Podfile里面没有指定source 那么就是master咯。(nice,这是我自己一些理解的)。
master
- Type: git (origin)
- URL: https://gitcafe.com/lloydsheng/Specs.git
- Path: /Users/jianyi/.cocoapods/repos/master
好了介绍了cocoapods原理和生产环境。
-----------------------
问题二:出现问题以后,我pull了线上的版本测试一下,之前是master主线。执行pod install后,也出现了问题。[!] The 'xxx' target has frameworks with conflicting names: networkxxx.
每次pod install 安装这里的时候就提示有framework 冲突了,按照log理解就是重复引用。但是podfile里面没有重复的引入,其他同事没有问题。因为其他同事忙着发版本,我刚来我先自己研究一下什么问题。当时考虑到一下几个方面:
是不是podfile引入了三个 source repo,他们自己里面有冲突?#一次次屏蔽调试没有问题,就是pod netwrokxxxx 处报错。百思不得其解,后来组长过来debug了一下,也不得其解,不过老鸟踩的坑比我多呀,建议我降低cocoapods版本到0.35.0,和他们环境一样再install看看。
嗯,降低版本后,一次就install成功了,也就是说这次的framework冲突是cocoapods版本引起的。所以这里给大家一个思路,有时候检查一下依赖的环境,也是解决问题的重要方法之一。
总结:第一个问题,出现问题本质是当是我pull的是master版本,里面的podfile不完整引起的,造成没有编译生成新的.xcworkspace和Podfile.lock文件。所以,出现这样问题解决办法,删除.xcworkspace,pod文件夹,Podfile.lock 如果可以生成新的.xcworkspace那么说明cocoapods编译没有问题。就不会出现diff: /../Podfile.lock: No such file or directory。报这个问题,因为.xcworkspace不是你pod install 自己生成的还是老项目留下的,他当然找不到对应的podfile.lock。
第二个问题,出现的问题就比较诡异,没有经验脑活着子一下子短路了的人会很惨。解决方案降低版本,或者你升级版本尝试一下。
最后分享一下pod命令:
ruby --version 看当前环境的ruby,大多数是建议切换换成淘宝的ruby镜像
pod --version 看当前cocoapods版本
pod repo list 查看你本地clone下来的specs,这样pod update/isstall 会先从本地查找找库的资源路径的
pod repo remove master 刚刚说了,这是删除cocoapods 默认的specs
pod repo add master https://gitcafe.com/lloydsheng/Specs.git 指定自己的默认spec
pod repo update 更新本地和服务器的repo 数据
cd ~/.cocoapods/ 环境目录了 进入看看有什么吧
cd ~/.cocoapods/repos/master/Specs/ 所有库的规范文档咯
-------------------
可见,我司用的是cocoapods,我自己使用就是pod完了,没有使用说明source 指定repo。这次我就好好学习,研究了一下pod 命令和怎么实现的机制。现在明白来,如何维护私有repo,向官方添加自己的库。nice,,,,,
至于升级后cocoapods改变了什么,导致报哪个冲突错误呢?现在还没有深入去考虑,目前的知识够我工作,麻利的干活,看到pod相关的语句心里有数了。对cocoapods背后技术原理有了数,遇事就不慌了。