2021-12-17 Podfile 使用和不用use_frameworks!区别

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!

不用useframeworks.png

2 、用了use_frameworks!

useframeworks.png

所以useframework选项只是对源代码形式的组件库有区别。

测试demo
https://github.com/hc2088/testpodfile

Podfile

CocoaPod 指定动态或者静态链接framework

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

你可能感兴趣的:(2021-12-17 Podfile 使用和不用use_frameworks!区别)