预处理器指令在Package.swift中不起作用?

时间:2019-08-26 02:55:35

标签: ios swift xcode11 swift-package-manager

在我的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中没有任何作用,我已经用watchOStvOS等进行过尝试。

#if os(iOS)这样的预处理程序指令是否应该在Package.swift中工作?在某些地方有可行的示例吗?

1 个答案:

答案 0 :(得分:1)

还没有找到一种方法,但是发现用平台检查开始对单个文件进行门控很有帮助。它为二进制文件增加了微不足道的大小,并且使包含或排除文件进行编译变得更加容易,尤其是当您支持多个依赖项管理器时。同意这是应该支持的东西。