Podfile 中 use_frameworks! 的作用

use_frameworks!生效的条件
1.use_frameworks!只有在第三方库的podspec文件中没有设置s.static_framework = true/falue时有效,如果第三方库的podspec文件中设置了s.static_framework = true/false, 那么依podspec中的设置为准。
2.第三方库必须是源代码,否则也不生效。比如:原来是.a,.framework静态库,那么不管Podfile中是否添加use_frameworks!都不会影响原来的结果。

所谓的库就是一段编译好的二进制文件+头文件+相关的资源文件,然后提供给别人使用。
静态库(.a):在编译时会将库copy一份到目标程序中进行合并,编译完成之后,目标程序不依赖外部的库进行运行,缺点是会使应用程序变大
动态库(.dylib):编译时只存储了指向动态库的引用。可以多个程序指向这个库,在运行时才加载然后动态链接,优点不会使体积变大。
Framework:实际上是一种打包方式,打出来的包可以是动态库也可以是静态库。它是将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。

对于CocoaPods管理的第三方库是否使用的Framework,可以通过Podfile中的use_frameworks来控制
在Podfile中如果不加use_frameworks!,cocoapods会生成相应的 .a文件(静态链接库), Link Binary With Libraries: libPods-xxx.a 包含了其他用pod导入有第三库的.a文件
使用了use_frameworks!,cocoapods会生成对应的frameworks文件(包含了头文件,二进制文件,资源文件等等)Link Binary With Libraries:Pods_xxx.framework包含了其它用pod导入的第三方框架的.framework文件


iOS项目中use_frameworks!的使用场景
不使用frameworks的场景
1.纯oc项目中 通过pod导入纯oc项目

使用frameworks的场景
1.swift 项目中通过pod导入swift项目,必须要使用use_frameworks!,否则报错,在需要使用的到地方 import AFNetworking

可加可不加的场景
1.swift 项目中通过pod导入OC项目
1)使用use_frameworks,在桥接文件里加上#import "AFNetworking/AFNetworking.h"
2)不使用frameworks,桥接文件加上 #import "AFNetworking.h"

use_frameworks!何时生效
use_frameworks!是否生效依赖于podspec指向的第三库的实际情况。
use_frameworks!不生效场景
1.如果podspec指向的第三库自己本身就是一个.a 静态库,或者.framework 静态库,
podfile是否使用use_framework
集成到主工程后,没有区别,都是在app资源包下,与app主二进制可执行程序集合成一个整体执行文件

2, 如果组件库是.framework 动态库
那么无论podfile是否使用use_framework都没啥区别,都是在app资源包下面的framework目录下。

3,podspec 既有静态库又有动态库
静态库链接到可执行文件中去。动态库在Frameworks下app启动动态链接。

use_frameworks!生效场景
1,依赖的pod组件库是源代码
如果在podfile中使用了use_framework,会打成动态库framework,放到app Frameworks目录下。 app启动时,动态链接。
如果是不用useframework,会编译成.a,随着编译一起打进app二进制可执行程序内。

podspec中s.static_framework与Podfile中use_frameworks!的优先级
podspec static_framework 的优先级大于 Podfile中的use_framework! :linkage的优先级。
也就是说以podspec中的为准。Podfile 只是改变,在podspec中没有用static_framework指定的为true或false情况下的集成方式。
如果podspec中源代码的pod库s.static_framework = true,则Podfile中用 use_frameworks! :linkage => :dynamic 也不会改变动态库的方式。


当在podfile文件中使用use_frameworks!指令时,CocoaPod在安装Pod时,会用framework方式组织资源(默认使用lib方式)
同时该指令还提供扩展选项,指定动态framework或者静态framework
use_frameworks! #使用默认值,根据podspec 类型自行设置static或者dynamic
use_frameworks! :linkage => :static # 使用静态链接
use_frameworks! :linkage => :dynamic #使用动态链接


当在podfile中设置了use_frameworks! ,但是没有指定linkage => :static或linkage => :dynamic时,则会根据podspec文件中的根配置static_framework = true/false来设置。
和use_frameworks!的起作用条件一样,即使在use_frameworks!后面加了linkage => :static或linkage => :dynamic,也只对源码Pod有效,对已经是framework的pod不起作用。
注意:如果pod中的framework是动态库,那么在pod install后,会在相应的target的Build Phases设置中添加[cp] Embed Pods Frameworks脚本,以动态库的方式将framework输出到最终产物中。

如果在podspec中既有 静态库,又有动态库:
s.dependency 'xxx' //是一个动态库
s.dependency 'Bugly' //是静态库

 

那么在Podfile中:
1、不使用:use_frameworks!
或者使用:
use_frameworks! :linkage => :static
按照静态库进行编译,则可以编译通过.

2、使用:use_frameworks!
或者
使用 use_frameworks! :linkage => :dynamic
进行动态库进行编译时,就会pod install报错:



参考文章:
https://www.jianshu.com/p/8059330a61cd
https://juejin.cn/post/6974224632983322655
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章