我有一個開源的、我維護的 Objective-C 庫。它已經存在很長時間了,我一直將它作為構建框架的可嵌入 Xcode 專案以及通過 Carthage 和 Cocoapods 分發。(有問題的庫是ORSSerialPort。)
我最近通過創建 Package.swift 檔案添加了對使用 Swift 包管理器安裝它的支持(請參閱此提交)。我能夠在不進行任何源代碼或結構更改的情況下這樣做,這很有幫助,因為我需要在可預見的未來繼續將它作為一個框架分發。
但是,當您在框架的公共標頭中使用雙引號 #import 時,Xcode 12 包含一個新的(或至少是默認啟用的?)警告。我已經在幾個地方這樣做了,所以切換到尖括號對于框架來說是正確的(參見這個提交)。
我現在才發現 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 檔案都在同一個 Source 檔案夾中。)
uj5u.com熱心網友回復:
我最近有同樣的問題。我發現解決此問題的唯一方法是將包含更改為標準用戶樣式包含
#import "ORSSerialPacketDescriptor.h"
當然,這會破壞 Objective-C 客戶端的標題。但由于 Swift 使用模塊映射,您仍然可以在 Swift 代碼中使用它。
uj5u.com熱心網友回復:
有關構建公共標頭的方法,請參閱此檔案,以便 CocoaPods 和 SwiftPM 客戶端可以使用相同的語法訪問它們。回購中也有幾個例子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/493460.html
