cocoapods
3种类形的 podspec 库:
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二进制可执行程序内。
- 4,podspec 既有静态库又有动态库
静态库链接到可执行文件中去。动态库在Frameworks下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!
2 、用了use_frameworks!
所以useframework选项只是对源代码形式的组件库有区别。
测试demo
https://github.com/hc2088/testpodfile
Podfile
1、
当在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来设置。
另外,linkage => :static或linkage => :dynamic只对源码Pod有效,对已经是framework的pod不起作用。
而且,如果pod中的framework是动态库,那么在pod install后,会在相应的target的Build Phases设置中添加[cp] Embed Pods Frameworks脚本,以动态库的方式将framework输出到最终产物中。
2、
podspec static_framework 配置大于 Podfile中的use_framework! :linkage的配置
如果podspec中源代码的pod库
s.static_framework = true
则Podfile中用 use_frameworks! :linkage => :dynamic 也不会改变动态库的方式
即:
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的默认行为:点击这里了解
检测framework是否用的是静态库:点击这里
find -E . -type f -iregex ".*\.framework\/[^./]*" -exec file {} \; | grep ': current ar archive' | sed 's/.*\/\(.*.framework\).*/\1/'
2022-07-14
podspec:
既有 静态库,又有动态库:
s.dependency 'xxx' //是一个动态库
s.dependency 'Bugly' //是静态库
Podfile:
1、
不使用:
use_frameworks!
或者使用:
use_frameworks! :linkage => :static
可以编译通过.
2、
使用:
use_frameworks!
或者
使用 use_frameworks! :linkage => :dynamic
pod install报错:
[!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries: (/xxx/example/ios/Pods/Bugly/Bugly.framework)
如果在
podspec 添加
s.dependency 'xxx' //是一个动态库
s.dependency 'Bugly' //是静态库
s.static_framework = true
在podfile 则三种方式都可以:
use_frameworks!
# use_frameworks! :linkage => :dynamic
# use_frameworks! :linkage => :static