问题描述
我正在尝试使用 Package.swift
为我的 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
iphonesimulator
、iphoneos15.0
、iphonesimulator15.0
、iphonesimulator14.5
、iphoneos14.5
作为 sdk。 (Xcode 12 和 Xcode 13 beta,使用 xcode-select
)
解决方法
感谢支持善良的陌生人,我确实设法弄明白了:有两种方法。
主要的解决方案是使用 -destination
而不是 -sdk
。好的,? _dump:
Xcode 工作区中的 Swift 包 (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 工作区或通过运行
SchemeName
获取 - 使用的目的地是
platform=iOS Simulator,name=iPhone 12
。您可以从包含 Xcode 项目、工作区或包的目录中的xcodebuild -workspace ./WorkspaceName.xcworkspace -scheme SchemeName -showdestinations
获取目标列表。 - 我通过只是选择
platform
和name
属性使其工作,而不指定OS
或 `ID。这很好,因为 CI 系统可能适用于不同操作系统的不同 Xcode,尽管您可能更愿意指定它。 - 您需要正确格式化目的地,
xcodebuild
将它们打印在 json 中,但您应该以逗号分隔并以等号提供它们。
xcodebuild -list
没有 Xcode 工作区的 Swift 包
如果您没有工作区,您可以:
- 运行
xcodebuild -list
- 选择最有意义的方案(可能是标有
your-package-name-is-here-Package
的方案) - 运行:
xcodebuild -scheme SchemeName -destination 'platform=iOS Simulator,name=iPhone 12' test
- 警告:实际上要确保不要在同一目录中有工作区。 (即不包含您的 Swift 包,因为 Xcode 会混淆。)如果它看到一个工作区,它不会检测基于当前目录中的 Package.swift 自动生成的 Xcode 方案.