CocoaPods是iOS平台上流行的第三方包管理工具。基本的介绍及使用方法可参考《唐巧的博客——用CocoaPods做iOS程序的依赖管理》,这里就不做介绍了。
在CocoaPods的使用过程中,会根据Podfile的内容,来抓取第三方库的源文件和生成其它相关的文件。这些文件均存放在Pods目录中,并通过生成的Pods.xcodeproj项目来进行管理。除此之外,还有几个关键的文件位于目录:Pods/Target Support Files/Pods-XXX/ 中,下面会讲到如何使用它们来解决我们标题中的问题。
问题:什么情况下需要共享Pods.xcodeproj ?
有很多iOS App会同时开发iPhone和iPad两个独立客户端,而不是开发单独的Universal客户端。这时候通常有两个.xcodeproj工程,虽然单个工程通过两个Target也能达到类似的效果,但这里不考虑这种情况。如果两个.xcodeproj工程可以共享Pods.xcodeproj,那么维护Pods会是非常的方便。
示例:共享Pods.xcodeproj给其它的Project
让我们开始,看看如何通过一些设置来满足这个需求。
准备
我们创建SharePodsDeme目录来放置我们的工程文件,包括:Phone和Pad项目文件。
创建SharePodsDemoPhone工程
我们创建一个空的示例项目SharePodsDemoPhone,放置在SharePodsDeme目录里,注意文件的层级关系如下:
SharePodsDeme/
SharePodsDeme/SharePodsDemoPhone.xcodeproj
SharePodsDeme/SharePodsDemoPhone/
SharePodsDeme/SharePodsDemoPhone/*
在SharePodsDeme目录下创建Podfile,内容如下:
1 | platform :ios, '8.0' |
执行pod install后,会生成SharePodsDemoPhone.xcworkspace,打开SharePodsDemoPhone.xcworkspace后,如下图:
创建SharePodsDemoPad工程
用同样的方式在SharePodsDeme目录下创建SharePodsDemoPad工程,此时的目录结构见下图
拖入SharePodsDemoPad工程到SharePodsDemo工作区
将SharePodsDemoPhone.xcworkspace重命名为SharePodsDemo.xcworkspace后打开。将SharePodsDemoPad.xcodeproj拖入SharePodsDemo.xcworkspace中,注意:需要拖放到最顶层。
现在就可以在SharePodsDemo工作区中同时管理SharePodsDemoPhone和SharePodsDemoPad这两个项目了,不过此时SharePodsDemoPad项目中还不能引入Pods中的文件的。
复制xcconfig
在SharePodsDemoPad项目中创建Pods的Group,然后在Pods/Target Support Files/Pods-SharePodsDemoPhone/目录下找到Pods-SharePodsDemoPhone.debug.xcconfig和Pods-SharePodsDemoPhone.release.xcconfig这两个文件,并插入到新建的Pods Group中
注意:不要勾选Copy items if needed
设置Configureations
修改SharePodsDemoPad的项目Configureations设置,添加对应的配置文件,如下图
添加Build Phases
在Link Binary With Libraries中添加libPods-SharePodsDemoPhone.a
这个时候再试试编译SharePodsDemoPad,应该可以编译成功了。
为了让CocoaPods能够正常工作,还有几个Build Phases需要添加到SharePodsDemoPad中。这些Build Phases的名字都是以[CP]开头,具体的内容直接从SharePodsDemoPhone复制过来即可。
这样所有的设置就完成了,以后可以方便的共享Pods中的内容了。上面的这个流程其实就是CocoaPods命令中所执行的部分内容。希望这篇文章能够让你对CocoaPods有进一步了了解。
最终的项目文件:
最后
其实你不需要手动完成上面的步骤,试着把Podfile改成下面的样式,然后pod install结果是一样的:)
1 | platform :ios, '8.0' |
其它
替换RubyGems源
由于河蟹的原因RubyGems无法正常访问,之前Taobao维护的镜像现在已经不再维护了,所以需要切换到Ruby China提供的镜像。
请尽可能用比较新的 RubyGems 版本,建议 2.6.x 以上。
$ gem update --system # 这里请翻墙一下
$ gem -v
2.6.3
$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.org
# 确保只有 gems.ruby-china.org
查看详情或其它问题请访问 https://gems.ruby-china.org
Pods目录是否要放入版本管理系统中?
我的建议是把Pods目录也纳入版本管理系统之中,当然Podfile和Podfile.lock是必须放入版本管理系统中的。在团队开发过程中,确保开发环境的一致性非常重要。Pods目录中生成的文件会随着执行不同的命令而产生不同的变化,比如:不同CocoaPods版本;执行pod install或者pod update命令。另外,也保证了代码的完整性,在获取到最新的代码后,就可以开始编译项目了。
这样做主要的缺点是纳入版本管理系统的文件会更多,这个应该不是什么大问题。大的二进制文件可以使用LFS来管理。