swift - 排除 Swift 包中的文件

标签 swift xcode11 swift-package-manager

要排除文件的整个部分,我可以使用宏来定位平台,例如 #if os(iOS) ||操作系统(watchOS)

有没有办法在 Package.swift 中执行此操作,或者有其他方法可以在 Swift Package Manager 中为特定平台定位几个文件?

最佳答案

Is there a way to do this in Package.swift ... ?

Package.swift也可以使用 Swifty,因为包声明文件本身就是一个 .swift 文件。

这里有一些使用 Swift 5.3 的例子 Package Manager Conditional Target Dependencies SE-0273 条件时间

// swift-tools-version:5.3
import PackageDescription

// ...
    targets: [
        .target(
            name: "BKSecurity",
            dependencies: [
                .product(name: "Crypto", condition: .when(platforms: [.linux])),
                "BKFoundation"
        ]),
// swift-tools-version:5.3
import PackageDescription

// ...
    targets: [
      .target(
        name: "CombineShim",
        dependencies: [
          .product(name: "OpenCombine", 
                   package: "OpenCombine",
                   condition: .when(platforms: [.wasi, .linux])
        )]
      ),
      .target(
        name: "TokamakShim",
        dependencies: [
          .target(name: "TokamakDOM", condition: .when(platforms: [.wasi])),
          "SomeCommonDependency"
        ]
      ),
// swift-tools-version:5.3
import PackageDescription

let supportsCoreAudio: BuildSettingCondition = 
        .when(platforms: [.iOS, .macOS, .tvOS, .watchOS])
let supportsALSA: BuildSettingCondition = 
        .when(platforms: [.linux])

let package = Package(
    name: "portaudio",
// ...
  targets: [
    .target(
      name: "libportaudio",
      dependencies: [],
      cSettings: [
        .define("PA_USE_COREAUDIO", supportsCoreAudio),
        .define("PA_USE_ALSA", supportsALSA)
      ],
      linkerSettings: [
        .linkedLibrary("asound", supportsALSA),
        .linkedFramework("CoreAudio", supportsCoreAudio),
        .linkedFramework("CoreServices", supportsCoreAudio),
        .linkedFramework("CoreFoundation", supportsCoreAudio),
        .linkedFramework("AudioUnit", supportsCoreAudio),
        .linkedFramework("AudioToolbox", supportsCoreAudio)
    ]),
  ]
//...
)

请注意,#if os(…) 可以在 Package.swift 中使用。但是,Package.swift 是在构建平台的上下文中评估、构建和执行的。因此,#if os(...)目标平台与构建平台相同 的上下文中很有用,例如macOS、Linux 或 Windows。

Package.swift

import PackageDescription

let package = Package(
    // ...
    targets: {
        var targets: [Target] = [
            .testTarget(
                name: "QuickTests",
                dependencies: [ "Quick", "Nimble" ],
                exclude: ["SomeFile.ext"]
            ),
        ]
#if os(macOS)
        // macOS build platform
        targets.append(contentsOf: [
            .target(name: "QuickSpecBase", dependencies: []),
            .target(name: "Quick", dependencies: [ "QuickSpecBase" ]),
        ])
#else
        // not macOS build platform, e.g. linux
        targets.append(contentsOf: [
            .target(name: "Quick", dependencies: []),
        ])
#endif
        return targets
    }(),
)

另见

关于swift - 排除 Swift 包中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57619273/

相关文章:

ios - 如何在 Swift 中以编程方式更改 UICollectionViewCell 大小?

ios - SwiftUI:自定义按钮无法识别具有清晰背景和 buttonStyle 的触摸

ios - Swift 5 (Xcode 11 Betas 5 & 6) - 如何写入 JSON 文件?

swift - 生成resource_bundle_accessor,类型 'Bundle'没有成员 'module'

swift - Xcode:在 Xcode 14 中使用包

ios - 在 Swift 中使用可编码扩展更新对象属性

ios - fatal error : use of unimplemented initializer 'init(coder:)' for class

swift - "public"在 Swift 中意味着什么?

ios - 当用户点击带有 iOS 13 Swift 5 的推送通知时,在特定 View 中打开应用程序

ios - iOS 设备上的 Rest 服务器使用 Swift