当公共标头使用尖括号 (<>) 时,Swift Package Manager 无法构建 Objective-C 包 #imports



我有一个开源的,我维护的Objective-C库。它已经存在很长一段时间了,我一直把它作为一个可嵌入的Xcode项目来发布,它可以构建一个框架,也可以通过Carthage和Cocoapods来发布。(有问题的库是ORSSerialPort.)

我最近添加了对Swift包管理器安装它的支持(见这个提交),通过创建一个Package. Swift文件。我能够在不做任何源代码或结构更改的情况下做到这一点,这很有帮助,因为在可预见的未来,我需要继续将其作为框架分发。

然而,Xcode 12包含了一个新的(或者至少是默认的?)警告,当你在框架的公共头中使用双引号#import时。我已经在几个地方这样做了,所以切换到尖括号是正确的框架(见这个提交)。

我现在才发现SwiftPM不再构建这个包,因为这个。如果失败,将显示以下错误:

In file included from /Users/andrewmadsen/Developer/ORSSerialPort/Source/ORSSerialPort.m:28:
/Users/andrewmadsen/Developer/ORSSerialPort/Source/ORSSerialRequest.h:28:9: fatal error: 'ORSSerial/ORSSerialPacketDescriptor.h' file not found
#import <ORSSerial/ORSSerialPacketDescriptor.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
[0/1] Compiling ORSSerial ORSSerialPort.m

一个可能的解决方案(这确实有效,但有点恶心),是用#ifdef来约束任何导入,然后在Package.swift中创建目标时在cSettings参数中传递一个定义,但这似乎有点恶心和笨拙。在这个项目中,它还不错,但在另一个项目中,我有很多,更多的头受到这个问题的影响。

所以,对于我的问题的根源:有没有办法说服SPM构建一个Objective-C包,其中公共头文件使用<>尖括号包含包中的其他公共头文件?

我已经尝试在cSettings中指定标题搜索路径,但这会产生相同的错误:

.target(
name: "ORSSerial",
path: "Source",
exclude: ["ORSSerialBuffer.h"],
publicHeadersPath: ".",
cSettings: [
.headerSearchPath(".")
]
)

(所有。h和。m文件都在同一个源文件夹中)

我最近也遇到了同样的问题。我发现解决这个问题的唯一方法是将include更改为标准用户样式的include

#import "ORSSerialPacketDescriptor.h"

当然,这会破坏Objective-C客户端的头文件。但是由于Swift使用了模块映射,你仍然可以在Swift代码中使用它。

最新更新