在我的 Swift 包中,我试图排除一些目录,以便为某些目标编译,如下所示:
import PackageDescription
let package = Package(
name: "SPMUIKit",
products: [
.library(
name: "SPMUIKit",
targets: ["SPMUIKit"]
)
],
targets: [
.target(
name: "SPMUIKit",
exclude: {
var exclude = [String]()
#if !os(iOS) || !canImport(UIKit)
exclude.append("UIKit")
#endif
return exclude
}()
)
]
)
它没有按预期工作。举个例子,我的 Swift 包在UIKit/UILabel.swift
中有这个:
import UIKit
public extension UILabel {
static func spmUIKitTest() {
print("UILabel.spmUIKitTest from Swift package")
}
}
为了测试它,我将其拖到一个新的 Xcode 11 iOS 应用程序中并在项目信息中链接库,然后将此代码添加到ViewController
:
import UIKit
import SPMUIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UILabel.spmUIKitTest()
}
}
编译错误:// Type 'UILabel' has no member 'spmUIKitTest'
如果我从Package.swift
中删除#if !os(iOS) || !canImport(UIKit)
,它可以很好地编译。似乎预处理器宏在Package.swift
中没有任何作用,我已经尝试过使用watchOS
和tvOS
等。
像#if os(iOS)
这样的预处理器指令应该在Package.swift
工作吗?某处有工作示例吗?
还没有找到一种方法来做到这一点,但确实发现通过平台检查开始控制单个文件很有帮助。它向二进制文件添加的大小可以忽略不计,并且可以更轻松地包含或排除要编译的文件,尤其是在支持多个依赖项管理器时。同意这是应该支持的东西。