运行 使用 xcodebuild 测试 Swift 包:错误测试必须在具体设备上 运行

Running tests for Swift package using xcodebuild: Error tests must be run on a concrete device

我正在尝试 运行 测试我的 Swift 包(由 Package.swift 定义)使用 xcodebuild:

xcodebuild -scheme "package-name-Package" -configuration "Debug" -sdk "iphonesimulator14.5" -arch "x86_64" test`

不幸的是,我不断收到此错误:

xcodebuild: error: Failed to build workspace package-name with scheme package-name-Package.
    Reason: Cannot test target “Target1Tests” on “Any iOS Simulator Device”: Tests must be run on a concrete device
Cannot test target “Target2Tests” on “Any iOS Simulator Device”: Tests must be run on a concrete device
Cannot test target “Target3Tests” on “Any iOS Simulator Device”: Tests must be run on a concrete device

我不确定 -sdk 使用什么。我已经阅读了 xcodebuild -showsdks 的输出并进行了适当的选择(我需要为 iOS 构建/测试)。我试过 iphoneos iphonesimulatoriphoneos15.0iphonesimulator15.0iphonesimulator14.5iphoneos14.5 作为 sdk。 (Xcode 12 和 Xcode 13 测试版,使用 xcode-select

感谢好心的陌生人的支持,我确实设法弄明白了:有两种方法。

主要解决办法是用-destination代替-sdk。好的,_dump:

Swift Xcode 工作区内的包 (WorkspaceName.xcworkspace)

我的首选方案:我最终将 Swift 包放在 Xcode 工作区中。我的意思是将包含 Swift 包(以及工作区)的根目录拖到 Xcode 项目导航器/工作区中。

优点是 Xcode 方案不会在您每次启动 Xcode 时生成,而是与工作区相关联。这意味着您的修改不会在您每次启动时重置 Xcode(例如添加环境变量)。

xcodebuild -workspace ./WorkspaceName.xcworkspace -scheme SchemeName -destination 'platform=iOS Simulator,name=iPhone 12' test

备注:

  • 如果要构建项目,只需设置正确的方案并将test替换为build
  • Here 是 Xcode 13 Beta 上可用的目的地列表。一个例子是:{ platform:iOS Simulator, id:FD90A730-A1D5-4BBC-B61A-0324400EE9EA, OS:15.0, name:iPhone 12 }
  • 您可以从 Xcode 工作区或通过 运行 xcodebuild -list
  • 获取 SchemeName
  • 使用的目的地是platform=iOS Simulator,name=iPhone 12。您可以从包含 Xcode 项目、工作区或包的目录中的 xcodebuild -workspace ./WorkspaceName.xcworkspace -scheme SchemeName -showdestinations 获取目标列表。
  • 我通过 选择 platformname 属性,而不指定 OS 或 `ID 来实现它。这很好,因为 CI 系统可能会用不同的 OS 来纠正不同的 Xcode,尽管你可能更愿意指定它。
  • 您需要正确格式化目的地,xcodebuild 将它们打印在 json 中,但您应该以逗号分隔并以等号分隔它们。

Swift 没有 Xcode 工作区的程序包

如果您没有工作空间,您可以:

  • 运行 xcodebuild -list
  • 选择最有意义的方案(可能是说 your-package-name-is-here-Package 的方案)
  • 运行:
xcodebuild -scheme SchemeName -destination 'platform=iOS Simulator,name=iPhone 12' test
  • 警告: 实际上请确保您在同一目录中有工作区。 (即不包含您的 Swift 包的一个,因为 Xcode 会混淆。)如果它看到一个工作区,它 不会 检测到自动生成的 Xcode方案基于当前目录下的Package.swift。