CocoaPods 相关问题
为什么用CocoaPods管理Swift的框架必须要用 use_frameworks!
因为Swift语言还在开发当中,很多语言特性还没有实现完成,所以Swift的ABI(程序二进制接口)还不稳定,Swift的运行时库 就没法直接放到系统中去,所以要打包到目标程序里,同时也解决Swift在多平台执行的兼容性问题。假如Swift允许编译静态库,那么每一个可执行程序(target:IWatch 等),都将包含一份Swift的运行时库,那是不能接受的。所以Swift 的代码只能用动态库的方式接入项目中。
Podfile中 use_frameworks!
就代表CocoaPod要把所有的库以 Dynamic library framework 的方式加到项目Target中。
静态库和动态库的区别
CocoaPods 导入的框架 却找不到 No such module
- 尝试在 目标Target->Build Phases->Link Binary With Libraries 重新添加一次。
Duplicate interface definition for class “_RxDelegateProxy”
有时候CocoaPod 导入的framework,编译时会发生多次定义的冲突,如上图。可能是在Search Paths->Header Search Paths中,加上不正确路径比如下图
错误解释是有同一个类,在编译的时候发现两份,一个在工程目录中,一个在构建之后的build目录,所以产生冲突,将无用的${SRCROOT}去掉。
- Header Search Paths 指的是#include #import查找头文件用的 ,给编译器用的
- Library Search Paths 连接静态库时查找目录中的静态库,是连接器用的
- User Header Search Paths 用于#include “file.h“这种方式搜索路径。
- Always Search User Paths 当为YES时,#include “file.h”和#include
都会先从User Header Search Paths 搜索,假如用户有要覆盖系统库的文件 可以这样来使用比如说 string.h . - ${SRCROOT} 代表源代码根目录
- $(inherited) 代表当前Target 的BuildSetting 继承来自Project 的BuildSetting配置信息。
- 参考
Podfile.lock
Podfile.lock里面记录了第一次pod install时获取的pods的版本,并保存下来,以便以后也获取这些版本保持代码稳定。包括多人协作时上传Podfile.lock,保证了多人使用相同Pod版本协作开发。
当Podfile 里面有 pod ‘AFNetworking’
- 小明 执行pod install 下载的是当前最新版本 比如2.0 。这个2.0版本会记录在Podfile.lock里
- 小刚 在一个月之后 从git 上下载代码,再次执行 pod install时,即使最新的AFNetworking 3.0 ,下载的也是和小明一样的2.0。保证了代码的一致性。
使用 pod install 还是 pod update ?
Pod install
这个是第一次在工程里面使用pods的时候使用,并且,也是每次你编辑你的Podfile(添加、移除、更新)的时候使用。 每次运行pod install命令的时候,在下载、安装新的库的同时,也会把你安装的每个库的版本都写在了Podfile.lock文件里面。这个文件记录你每个安装库的版本号,并且锁定了这些版本。 当你使用pod install它只解决了pods里面,但不在Podfile.lock文件里面的那些库之间的依赖。对于在Podfile.lock里面所列出的那些库,会下载在Podfile.lock里面明确的版本,并不会去检查是否该库有新的版本。对于还不在Podfile.lock里面的库,会找到Podfile里面描述对应版本(例如:pod “MyPod”, “~>1.2”)。
Pod update
当你运行 pod update PODNAME 命令时,CocoaPods会帮你更新到这个库的新版本,而不需要考虑Podfile.lock里面的限制,它会更新到这个库尽可能的新版本,只要符合Podfile里面的版本限制。
如果你运行pod update,后面没有跟库的名字,CocoaPods就会更新每一个Podfile里面的库到尽可能的最新版本。
正确用法:
你应该使用pod update PODNAME去只更新某个特定的库(检查是否有新版本,并尽可能更新到新的版本)。对应的,你应该使用pod install,这个命令不会更新那些已经安装了的库。
当你在你的Podfile里面添加了一个库的时候,你应该使用pod install,而不是pod update,这样既安装了这个库,也不需要去更新其它的已安装库。
你应该使用pod update去更新某个特定的库,或者所有的库(在Podfile的限制中)。