在我的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'
如果我从#if !os(iOS) || !canImport(UIKit)
中删除了Package.swift
,则编译正常。看来预处理器宏在Package.swift
中没有任何作用,我已经用watchOS
和tvOS
等进行过尝试。
像#if os(iOS)
这样的预处理程序指令是否应该在Package.swift
中工作?在某些地方有可行的示例吗?
答案 0 :(得分:1)
还没有找到一种方法,但是发现用平台检查开始对单个文件进行门控很有帮助。它为二进制文件增加了微不足道的大小,并且使包含或排除文件进行编译变得更加容易,尤其是当您支持多个依赖项管理器时。同意这是应该支持的东西。