Tl;DR
xcodebuild 和 xcrun 帮助在无头上下文中构建 Xcode 项目,例如在 CI 设置中。 swift 是 Swift REPL,主要用于服务器应用程序上的 Swift。因此,我们可以在不了解或不经常使用移动应用程序开发工具的情况下构建应用程序。我们在底层使用 xcodebuild 和 xcrun 与 Xcode 交互,尽管我们没有意识到这一点,因为它们捆绑在 Xcode's Command Line tools 中(文档存档,但仍然相关)。
fastlane 是一个示例 CI 工具,它使用这些工具自动执行构建过程、证书签名以及与 App Store Connect 的交互。
xcodebuild
xcodebuild 是 Xcode 捆绑的命令行工具包的一部分。来自manpages:
构建 Xcode 项目和工作区
xcodebuild 构建一个或多个包含在 Xcode 项目中的目标,
或构建一个包含在 Xcode 工作区或 Xcode 项目中的方案。
xcodebuild 有很多选项和用例。这些选项等效于 Xcode IDE 中的某些用户操作。示例用法:
xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyScheme
在 Xcode 工作区 MyWorkspace.xcworkspace 中构建方案 MyScheme。
在上面的命令中,我们在没有 Xcode 的情况下构建工作区,使用 Xcode 在内部运行的内容进行编译。 Xcode 只能安装在 macOS 上,我们使用它的命令行工具也有同样的限制,包括xcodebuild 和xcrun。
xcrun
xcrun 是 Xcode 的 CLI 工具的另一个 Xcode 命令行工具部分。来自manpages:
运行或定位开发工具
xcrun 提供了一种定位或调用共存的方法 - 和
来自命令行的平台感知开发工具,无需
要求用户修改makefile或以其他方式带来不便
支持多个 Xcode 工具链的措施。
xcrun [-sdk SDK] -find <tool_name>
xcrun 也常与Xcode-select 一起用于管理同一台机器上的多个 Xcode 版本。每个版本的 Xcode 都捆绑了自己的开发工具,我们可以使用 xcrun 获取它们的当前路径:
xcrun xcode-select --print-path
迅速
swift 是 Swift REPL。 swift 是一个命令行工具,它包含 Swift 工具链,但也可以安装在 Xcode 捆绑工具之外。 swift 与 xcodebuild 和 xcrun 不同,因为它是用 Swift 而不是 C 编译的。swift 在 MacOS manpages 文档中没有很好地记录,但是,Apple 在其 blog 中记录了这些工具:
Xcode 6.1 引入了另一种在
交互式 Read Eval Print Loop 或 REPL 的形式。
REPL 本质上是一个交互式编译环境或 shell。首先,REPL 读取代码,然后对其进行评估、打印并重复该过程。可以想象,与 IDE 相比,我们可以使用 REPL 开发的东西要少得多。但是,除了 iOS、watchOS 和 macOS 开发之外,Swift 还有其他用例。
swift 包括standard library,但不包括Foundation 和UIKit 等库。 iOS 或 macOS 开发几乎肯定需要这些 Swift 库,因此我们不能单独使用swift REPL 开发应用程序。但是,Swift on Server 项目经常使用 swift 在 Linux 甚至 Windows 机器上运行 Swift 代码。
为了更广泛地采用,Apple 已将swift 提供在 Xcode 不易使用的不同操作系统上。 Swift 现在还有 Docker support 和 Windows。 Docker 使我们能够在任何机器上运行swift,而不管底层操作系统如何。 swift 在这些应用程序中用作脚本语言。
SoS 奖励说明
swift 主要用于Swift on Server。 Swift on Server 对服务器应用程序具有出色的性能,具有更低的内存占用、快速的启动时间和确定性的性能。虽然它在某些任务上不如 .NET core 快,但这是因为 Swift 具有严格的类型系统、ARC 的垃圾收集以及针对特定于服务器的应用程序的较少优化,因此更加安全。许多早期采用者称赞改进的语言类型系统、内存效率和算法性能。事实上,Swift vapor 是comparable to Python 和 Ruby 在 JSON 序列化任务上的效率。 Swift 在极少数任务上可与 Java 媲美,但随着语言和生态系统的发展,这种情况可能会发生变化。