2021-12-17 Podfile 使用和不用use_fram
cocoapods
3种类形的pod组件:
-
1,如果组件是,.a 静态库,或者.framework 静态库,
podfile是否使用use_framework
集成到主工程后,没有区别(.framework没测试)
都是在app资源包下,与app主二进制可执行程序集合成一个整体执行文件 -
2, 如果组件是.framework 动态库
podfile是否使用use_framework
也没啥区别
都是在app资源包下面的framework目录下。
- 3,依赖的pod组件是源代码
源代码依赖,会打成动态库framework,放到app Frameworks目录下。 app启动时,动态链接。
如果是不用useframework,会编译成.a,随着编译一起打进app二进制可执行程序内。
测试方法如下:
app
Podfile
target 'testapp' do
# Comment the next line if you don't want to use dynamic frameworks
# use_frameworks!
# Pods for testapp
pod 'sourcecode',:path=>'../sourcecode'
pod 'dynamicframework',:path=>'../dynamicframework'
pod 'astaticlib',:path=>'../astaticlib'
target 'testappTests' do
inherit! :search_paths
# Pods for testing
end
target 'testappUITests' do
# Pods for testing
end
end
1、不用use_frameworks!
不用useframeworks.png2 、用了use_frameworks!
useframeworks.png所以useframework选项只是对源代码形式的组件库有区别。
测试demo
https://github.com/hc2088/testpodfile
重点内容
1、
当在podfile文件中使用use_frameworks!指令时,CocoaPod在安装Pod时,会用framework方式组织资源(默认使用lib方式),同时该指令还提供扩展选项,指定动态framework或者静态framework
use_frameworks! #使用默认值,根据pod类型自行设置static或者dynamic
use_frameworks! :linkage => :static # 使用静态链接
use_frameworks! :linkage => :dynamic #使用动态链接
如果在podfile中设置use_frameworks! ,又没有指定linkage => :static或linkage => :dynamic时,则会根据podspec文件中的根配置static_framework = true/false来设置。
另外,linkage => :static或linkage => :dynamic只对源码Pod有效,对已经是framework的pod不起作用。而且,如果pod中的framework是动态库,那么在pod install后,会在相应的target的Build Phases设置中添加[cp] Embed Pods Frameworks脚本,以动态库的方式将framework输出到最终产物中。
2、
如果podspec中源代码的pod库
s.static_framework = true
则Podfile中用 use_frameworks! :linkage => :static 也不会改变动态库的方式
即:
app的bundle 包下面Frameworks下面是不会有这个动态库的。
也就是说podspec中为准。
Podfile 只是改变,在podspec中没有用static_framework指定的为true或false情况下的集成方式。
3、
虽然不能改变下app的bundle 包下面Frameworks是否用动态库还是静态库方式
但是用了 use_frameworks 将会改变头文件的搜索方式。
如果在pod库中用了@import 这种方式的话,
就需要我们把Podfile中加上 use_frameworks
否则会编译报错。
也有其他方式处理。 那就是用cocoapods定制 plugin 插件了
定制Gemfile 引入gem 插件,在插件里面定制内容
在podfile中引入插件,然后在插件中修改cocoapods的默认行为
具体实现方案,不知道。
https://stackoverflow.com/questions/32591878/ios-is-it-a-static-or-a-dynamic-framework
11
I use this command to list all STATIC Frameworks from a path with a list of frameworks:
find -E . -type f -iregex ".*\.framework\/[^./]*" -exec file {} \; | grep ': current ar archive' | sed 's/.*\/\(.*.framework\).*/\1/'