我创建了一个开源库(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 这样的库如何在没有这些解决方法的情况下做到这一点,我仍然感兴趣。