在框架错误中包含非模块化标头 - 如何使传递依赖项与 cocoapods 一起工作



我创建了一个开源库(https://github.com/linkedin/LayoutTest-iOS(,里面有两个Cocoapods——LayoutTest和LayoutTestBase。LayoutTest 依赖于 LayoutTestBase,其中一个 .h 文件需要从 LayoutTestBase 导入一些东西。目前,我使用以下方法执行此操作:

@import LayoutTestBase;

但是,这仅在应用程序在其 Podfile 中使用use_frameworks!时才有效。某些应用程序不想使用此cocoapods选项。没有use_frameworks!,如果我使用:

#import <LayoutTestBase/LYTLayoutPropertyTester.h> // OR
#import "LYTLayoutPropertyTester.h"

但是,当将其与use_frameworks!一起使用时,它会给出错误:"在框架模块'LayoutTest.LYTLayoutTestCase'中包含非模块化标头">

显然,无论用户是否在其 Podfile 中使用use_frameworks!,都应该有一种方法可以执行此导入。如何让此库正确编译和运行?

研究

我看过堆栈溢出,这似乎是最相似的问题:具有依赖项的CocoaPods框架 - 在框架模块中包含非模块化标头。它提到这是 Parse 库的问题,但没有提到需要如何修复它。由于我拥有依赖项,因此我可以解决此问题。我还尝试在所有设置(项目、单元测试、所有 pod 等(中将"允许非模块化框架"设置为"是",但这似乎没有任何作用。

要重现

创建一个新项目。添加此 Podfile:

target :'{MyAppTarget}Tests' do
pod 'LayoutTest'
end

运行pod install .尝试在应用上运行单元测试。它将失败。现在,尝试将 LYTLayoutTestCase.h 更改为使用 #import <LayoutTestBase/LYTLayoutPropertyTester.h> 。它现在可以工作了。但是,如果您将use_frameworks!添加到 Podfile,它将不再起作用。

我不认为这是最佳解决方案,但我发现的解决方法是做一个#if __has_include并根据它是否是用use_frameworks!构建来执行两种解决方案

以下是指向github问题的链接,其中包含更多详细信息:https://github.com/linkedin/LayoutTest-iOS/issues/8

如果有人知道像 parse-SDK 这样的库如何在没有这些解决方法的情况下做到这一点,我仍然感兴趣。

最新更新