如何通过命令行为 iOS 构建 Swift 包?

Mic*_*tin 11 xcode xcodebuild uikit swift swift-package-manager

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

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

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

例如:

#if canImport(UIKit)
    // some invalid code
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*tin 16

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

swift build -v -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios13.0-simulator"
Run Code Online (Sandbox Code Playgroud)

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

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

来源

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


Max*_*tov 16

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

示例调用如下所示:

xcodebuild -scheme Foo \
  -destination 'platform=iOS Simulator,OS=13.5,name=iPhone 11 Pro'
Run Code Online (Sandbox Code Playgroud)

Foo您尝试构建的库产品的名称在哪里。您可以使用xcodebuild -list. 您可以使用此调用获取给定方案的可用目的地列表:

xcodebuild -showdestinations -scheme Foo
Run Code Online (Sandbox Code Playgroud)

  • 这是否需要将 Xcode 项目添加到包中?编辑:没关系,刚刚测试过,没有 Xcode 项目文件它也能正常工作! (2认同)
  • 我认为您几乎必须删除大括号并用“=”替换字段名称和字段值之间的“:”。然后在你的示例中它变成 `-destination 'platform=iOS Simulator,OS=15.0,name=iPhone 12'` (2认同)