【问题标题】:How can I build a Swift Package for iOS over command line?如何通过命令行为 iOS 构建 Swift 包?
【发布时间】:2020-05-31 08:45:19
【问题描述】:

在 Xcode 中,我可以将目标选择为“通用 iOS 设备”或任何 iOS 模拟器,我的包将为 ios 构建特定于平台的代码。

通过命令行“swift build”为 macOS 构建我的目标。

我想为 iOS 构建目标以用于 CI 目的。为 macOS 构建的问题是不会构建特定于 UIKit 的代码。

例如:

#if canImport(UIKit)
    // some invalid code
#endif

无效代码将不会被注意到,并将通过构建阶段。

理想情况下,我可以说类似swift build -platform iOS。有没有办法做这样的事情?

【问题讨论】:

    标签: swift xcode uikit xcodebuild swift-package-manager


    【解决方案1】:

    在撰写本文时(2019 年 2 月 16 日),一个可行的解决方案是:

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

    此命令使用-Xswiftc 通过将 sdk 从 macOS 覆盖到 iphonesimulator 来解决此问题。

    我们严格地添加了这些标志,以便开发人员可以解决问题,但他们也应该报告错误,以便我们可以为他们的需求提供适当的解决方案。

    Source

    所以我猜未来会有更优雅的解决方案。

    【讨论】:

    • 有趣。知道如何使它适用于混合的 Swift/ObjC 包吗?我的库的 swift 方面似乎构建良好,但导入 UIKit 时出现 ObjC 错误
    • @powerj1984 我正在用 Swift+C(不是 ObjC)做一个项目,可能会遇到类似的问题。我认为这与链接器有关。例如当您应该指定指向 iOS 二进制文件的链接时,您正在链接到 macOS 二进制文件。查看swift build -Xlinker -L/<somepath> 命令。我不知道解决方案,但这是一个起点
    • 谢谢迈克尔!如果我有机会,我可能会更多地研究它。现在我只是用 Swift 重写了我的 ObjC 代码? 我的库中的 ObjC 数量很少,所以对我来说非常简单
    【解决方案2】:

    从 Xcode 11 开始,xcodebuild 支持开箱即用的 SwiftPM 包。

    一个示例调用如下所示:

    xcodebuild -scheme Foo \
      -destination 'platform=iOS Simulator,OS=13.5,name=iPhone 11 Pro'
    

    Foo 将是您尝试构建的库产品的名称。你可以 使用xcodebuild -list 获取 SwiftPM 包可用方案的完整列表。 您可以通过此调用获取给定方案的可用目的地列表:

    xcodebuild -showdestinations -scheme Foo
    

    【讨论】:

    • 这是否需要将 Xcode 项目添加到包中?编辑:没关系,只是测试了一下,没有 Xcode 项目文件就可以正常工作!
    • 这个答案让我省了很多麻烦!谢谢。
    • 如何从目的地(从-showdestinations,例如{ platform:iOS Simulator, id:FD90A730-A1D5-4BBC-B61A-0324400EE9EA, OS:15.0, name:iPhone 12 })到要传递给-destination 的值?我收到了xcodebuild: error: Unable to find a destination matching the provided destination specifier
    • 我认为您几乎必须删除大括号并将字段名称和字段值之间的 : 替换为 =。然后在你的例子中它变成-destination 'platform=iOS Simulator,OS=15.0,name=iPhone 12'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2019-10-31
    • 2012-10-15
    • 2014-08-15
    • 2011-08-05
    相关资源
    最近更新 更多