在CocoaPods 1.5中使用静态库在导入时没有这样的模块

Fra*_*anc 7 static-libraries ios cocoapods swift

随着CocoaPods 1.5的发布,我试图从项目中的10-15个动态Pod迁移到将其作为静态库,以加快我的应用程序启动时间。

在此阶段,我的简单(即简单化)尝试是在运行pod安装时删除use_frameworks命令。这确实将我的pod转换为静态库。但是,当尝试导入我的Pod时,它也会在我的整个项目中产生一系列“没有这样的模块”(例如,“没有这样的模块PureLayout或没有这样的模块FirebaseMessaging)。

我并不精通Pod和动态/静态库的所有复杂性,并且在过去的一天中,我一直在尝试寻找良好的文档,以了解如何正确地为Swift项目导入,使用和部署静态库,但是找不到明确的指南。

我正在使用XCode 10.1和CocoaPod 1.5.2(客户端版本)。

有人可以通过提供有关如何从动态库转换为静态库的详细说明的链接来帮助我吗?

万分感谢!

Pau*_*ien 18

引入 CocoaPods 1.5.0use_modular_headers!仍然为静态库提供模块支持。发行说明中的详细信息。

或者,您可以将源中的模块化导入更改为文件导入。

我还建议您试用 CocoaPods 1.6.0 测试版,因为它对静态/动态库和框架问题进行了多项修复。

2020 更新

引入了CocoaPods 1.9.0use_frameworks! :linkage => :static,它将生成带有静态链接库和模块映射文件的完整框架。这通常是比 更好的方法use_modular_headers!

  • 有用!我不明白为什么,但它成功了:) 模块化标头的用途是什么?为什么不包含它们会阻止我的应用程序编译我的 Pod? (2认同)

Vit*_*lii 6

在大多数情况下,对于一个小项目来说,添加use_modular_headers!而不是删除就足够了import_frameworks!

或者,您可以尝试:modular_headers => true在“缺失”模块的每个 pod 声明之后添加:

pod 'Firebase/Auth' :modular_headers => true
pod 'Firebase/Database' :modular_headers => true
pod 'Firebase/Storage' :modular_headers => true
pod 'Firebase/DynamicLinks' :modular_headers => true
Run Code Online (Sandbox Code Playgroud)

然而,一个更大的项目可能包含不想是静态的模块,有或没有模块化标题。一个很好的例子是 Facebook SDK。对于这种情况有一个很酷的除了这里,它允许指定要离开动态哪些模块。

这是一个示例 podfile,其中除了 dynamic_frameworks 数组中列出的库之外,所有库都将是静态的:

platform :ios, deployment_target: '9.3'

inhibit_all_warnings!

# Import CocoaPods sources
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
dynamic_frameworks = ['Bolts', 'FBSDKCoreKit', 'FBSDKLoginKit', 'FBSDKShareKit']

# make all the other frameworks into static frameworks by overriding the static_framework? function to return true
pre_install do |installer|
    installer.pod_targets.each do |pod|
        if !dynamic_frameworks.include?(pod.name)
            puts "Overriding the static_framework? method for #{pod.name}"
            def pod.static_framework?;
                true
            end
        end
    end
end

target 'MyApp' do
pod 'SwiftLint'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
pod 'Firebase/DynamicLinks'
pod 'FBSDKCoreKit', '~> 4.33.0'
pod 'FBSDKLoginKit', '~> 4.33.0'
pod 'FBSDKShareKit', '~> 4.33.0'

end
Run Code Online (Sandbox Code Playgroud)