【问题标题】:Swift Package Manager - UIKit DependencySwift 包管理器 - UIKit 依赖
【发布时间】:2016-01-13 23:11:23
【问题描述】:

我的项目中有一个 Package.swift,例如:

import PackageDescription

let package = Package(
    name: "ProjectName",
        dependencies: [
           .Package(url: "https://github.com/example/repo.git", majorVersion: 0)
        ]
 )

当我运行swift build 时,我会收到类似...的错误

/project/Packages/WebViewController.swift:1:8: error: no such module 'UIKit'
import UIKit
       ^

我应该在哪里告诉 swift 包管理器在哪里可以找到 UIKit?

【问题讨论】:

    标签: swift swift2 swift-package-manager


    【解决方案1】:

    您必须更改一些 swiftc 选项才能针对正确的 sdk 和目标构建项目

    swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios13.0-simulator"
    

    【讨论】:

    • 这应该是公认的答案!我也可以使用以下命令确认它适用于 iOS 14:swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios14.0-simulator"
    • 对于 tvOS:swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk appletvsimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-tvos14.3-simulator"
    • 这对我有用,但是 Xcode 无法识别我想要使用 Package.swift 中指定的库依赖项的项目中的二进制文件。我想我错过了一个明显的步骤......?
    【解决方案2】:

    目前 Swift 包管理器有完整的 Xcode 支持。通过在我的 Package.swift 清单中指定平台是 iOS,我能够绕过这个错误。

    let package = Package(
        name: "MyPackage",
        platforms: [
            .iOS(.v8)
        ],
    

    然后你可以在 Xcode 中打开 Package.swift 文件,它就可以工作了。

    【讨论】:

    • 我遇到了原始问题,即使在定义平台时也是如此。
    • 不幸的是,我不得不为我的内部框架使用 git 子模块。 :(
    • 定义平台后,确保在构建时选择了顶部的 iPhone 模拟器。
    • 如何在 Xcode 中打开 Package.swift?当我尝试在 Xcode 中打开文件时,它不仅起作用。文件是否需要添加到项目中?
    【解决方案3】:

    让它不受平台限制地工作:

    您应该选择一个 基于 iOS 的目标以使其可用:

    如果你让它选择macOS(默认),你会得到错误。


    限制到特定平台

    如果您希望您的包仅适用于特定平台(例如仅适用于 iOS),您应该在 package.swift 文件中指定平台:

    let package = Package(
        name: "MyLibrary",
        platforms: [
            .iOS(.v10)
        ],
        products: [
    ,,,
    

    支持多平台

    如果您需要您的框架在多个平台上可用,请不要忘记检查导入框架的可用性,例如:

    #if canImport(UIKit)
    
    import UIKit
    
    #endif
    

    【讨论】:

    • 这就是答案!
    【解决方案4】:

    Swift 包管理器构建可执行文件以在 OS X(或 Linux)上运行; UIKit 是 iOS 中的一个框架,无法访问。

    随着 Swift 包管理器的发展,它可能是 iOS、tvOS 和其他可以访问的。

    2015 年 12 月 4 日下午 5:39,Daniel Dunbar (@apple.com) 写道:

    ...

    好的,现在我们只为主机平台(目前是 OS X 或 Linux)进行编译。除其他外,我们目前不知道(或可供选择的选项)您所针对的 SDK 或架构。我们也没有在清单中指定与哪些平台目标兼容的机制。

    【讨论】:

    【解决方案5】:

    使用条件编译块:

    #if canImport(UIKit)
    
    // Code specific to platforms where UIKit is available
    
    #endif
    

    来源:https://developer.apple.com/documentation/xcode/creating_a_swift_package_with_xcode

    【讨论】:

    • OP 需要一个快速构建错误的解决方案,而不是条件导入...
    【解决方案6】:

    确保选择 iPhone 作为模拟器目标。 Mac 目标是默认的,这将不起作用...如果 Xcode 可以查看清单并根据该清单选择默认模拟器,那就太棒了...

    【讨论】:

      【解决方案7】:

      如果您的umbrella header(<module_name.h>)[About] 包含

      #import <UIKit/UIKit.h>
      

      这意味着您可以跳过在每个文件中指定import UIKit。但似乎SPM 不支持它。我也不支持使用@_exported 属性

      你可以明确写import UIKit

      【讨论】:

        猜你喜欢
        • 2020-08-11
        • 2022-08-12
        • 2021-10-10
        • 2015-02-01
        • 2017-09-30
        • 2018-09-23
        • 2021-09-25
        • 1970-01-01
        • 2017-05-15
        相关资源
        最近更新 更多