Cocoapods 大家都用得不少,相信下面这一行都不陌生:
use_frameworks!
这一行的作用声明是cocoapods生成的target使用framework的形式进行依赖。这里有个比较容易混淆的概念,framework并不等于动态库,实际上framework和动态库是两个独立的概念,framework也有静态库的,比如友盟提供的sdk,就是一个静态的framework.
framework 的mach-o type 可以自行选择:
cocoapods 的use_framework! 生成的依赖默认是动态库依赖。
对于大部分场景,动态库和静态库依赖对开发者来说其实区别不大,其中一个小小的区别就是,use_framework会自动生成一个copy framework的脚本。如图:
由于动态库的代码段并不会链入可执行文件,而是作为一个单独的文件放在Framework文件夹,在app启动的时候通过dyld加载,因此,cocoapods生成的这些动态依赖库需要复制到相应的文件夹。其作用大概相当于这里:
这里添加的动态库也会打进app里面。
于是问题就来了,如果我的cocoapods由于一些历史原因,不能使用use_framework,但是又依赖了一些自定义的动态库,这怎么处理呢?
一开始我尝试多target 使用不同的配置,比如TargetA 用静态依赖,TargetB用动态依赖,但是会报这个错误:
貌似走不通。然后到cocoapods 的github上翻一下issue,看有没有类似的案例,然后发现一个绝望的事实:
https://github.com/CocoaPods/CocoaPods/issues/3839
官方不支持,也不打算支持。
所以,放弃混用的念头吧,乖乖地换成全局的use_framework! , 或者自己在buildphase里自己写copy的脚本吧。