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

时间:2018-11-12 15:01:31

标签: ios swift cocoapods static-libraries

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

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

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

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

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

一吨!

2 个答案:

答案 0 :(得分:1)

CocoaPods 1.5.0引入了use_modular_headers!,以仍然通过静态库提供模块支持。 release notes中的详细信息。

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

我还建议您试用CocoaPods 1.6.0 beta,因为它有一些针对静态/动态库和框架问题的修复程序。

答案 1 :(得分:1)

在大多数情况下,对于小型项目,只需添加use_modular_headers!而不是删除的import_frameworks!就可以了。

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

pod 'Firebase/Auth' :modular_headers => true
pod 'Firebase/Database' :modular_headers => true
pod 'Firebase/Storage' :modular_headers => true
pod 'Firebase/DynamicLinks' :modular_headers => true

但是,较大的项目可能包含不希望是静态的模块,带有或不带有模块头。一个很好的例子是Facebook SDK。对于这种情况,有一个很酷的添加here,它可以指定要保持动态的模块。

这是一个示例Podfile,其中所有libs都是静态的,但在dynamic_frameworks数组中列出的libs除外:

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