xcodebuild、xcrun和swift命令行工具之间有什么区别?

kpbwa7wx  于 2022-11-17  发布在  Swift
关注(0)|答案(2)|浏览(305)

我们可以通过多个命令从命令行构建和运行Swift代码/项目,而无需使用Xcode。我听说过用于Xcode开发的xcodebuildxcrunswift。我确实使用了fastlane,但我并不真正了解背后的工具。
我是一个使用Mac的iOS开发人员,我使用Xcode进行开发,所以我以前没有使用过这些命令行工具。
每个命令之间的区别是什么?有没有哪种情况下使用一个命令比使用另一个命令更好?

icnyk63a

icnyk63a1#

Tl;灾难恢复

xcodebuildxcrun帮助在无头上下文中构建Xcode项目,例如在CI设置中。swift是Swift REPL,主要用于Swift on Server应用程序。因此,我们可以在不了解或不经常使用移动的应用开发工具的情况下构建应用。我没有意识到这一点,因为它们被捆绑在Xcode's Command Line tools中(文档存档,但仍然相关)。
fastlane是一个示例CI工具,它使用这些工具自动化构建过程、证书签名以及与App Store Connect的接口。

xcode编译

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上,使用它的命令行工具也有同样的限制,包括xcodebuildxcrun

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不同于xcodebuildxcrun,因为它是Swift而不是C编译的。swift在MacOS manpages文档中没有详细说明,但是,Apple在其blog上记录了这些工具:
Xcode 6.1引入了另一种方式来实验Swift,即交互式读取评估打印循环(REPL)。
REPL本质上是一个交互式编译环境或shell。首先,REPL读取代码,然后对其求值,打印,并重复该过程。正如你所想象的,与IDE相比,我们可以使用REPL开发的东西要少得多。然而,除了iOS、watchOS和macOS开发之外,Swift还有其他用例。
swift包括standard library,但不包括FoundationUIKit等库。这些Swift库几乎肯定是iOS或macOS开发所需的,因此我们无法单独使用swift REPL开发应用。然而,Swift on Server项目经常使用swift在Linux甚至Windows机器上运行Swift代码。
为了获得更广泛的应用,苹果已经在Xcode还没有的不同操作系统上提供了swift。Swift现在也有Docker support和Windows。Docker使我们能够在任何机器上运行swift,而不管底层操作系统是什么。swift在这些应用程序中充当了一种 * 脚本 * 语言。

针对SoS的附加注解

swift主要用于Swift on Server。Swift on Server对于服务器应用程序具有很好的性能,具有较低的内存占用、快速的启动时间和确定性的性能。尽管它在某些任务上不如.NET核心那么快,但这是因为Swift具有严格的类型系统、使用ARC的垃圾收集、对于特定于服务器的应用程序的优化较少。许多早期的采用者都称赞Swift改进了语言类型系统、内存效率和算法性能。事实上,Swift vapor在JSON序列化任务的效率上可以与Python和Ruby相媲美。Swift在很少的任务上可以与Java相媲美,但随着语言和生态系统的发展,这种情况可能会改变。

tzdcorbm

tzdcorbm2#

执行

xcrun视为一个 * 方便的前缀 *,用于调用 * 当前活动 * Xcode工具链中的各种命令行工具。
同一台机器上可以安装多个Xcode工具链(例如最新版本、测试版和/或旧版)。使用xcode-select设置要使用的Xcode工具链路径。或者,可以通过设置环境变量SDKROOTDEVELOPER_DIR来指定活动的开发者工具链

### open 'bin' directory for the currently active Xcode toolchain 
open `xcode-select --print-path`/usr/bin

可以使用xcrun调用的工具包括:

  • xcrun simctl <subcommand> ~ iOS模拟器控件
  • xcrun xcodebuild … ~构建/测试Xcode项目和工作空间
  • xcrun xctrack <commands> [options] ~记录、导入和导出仪器.trace文件
xcrun not_a_tool  help

# xcrun: error: 
#   sh -c '/Applications/Xcode.app/…/bin/xcodebuild 
#         -sdk /Applications/Xcode.app/…/MacOSX.sdk 
#         -find not_a_tool 2> /dev/null' 
# failed with exit code 17664: (null) (errno=Invalid argument)

xcode编译

xcodebuild视为一个命令行工具,专门用于 * 利用多个其他工具来管理整个项目构建流程 *。调用xcodebuild将执行多个任务,就像创建和/或测试项目时Xcode GUI菜单中的BuildTest一样。

xcodebuild -help

注意:xcodebuild可以在没有后续xcrun的情况下调用。

xcrun xcodebuild -version
# Xcode 13.2.1
# Build version 13C100

xcodebuild -version 
# Xcode 13.2.1
# Build version 13C100

快速
swift(单独)视为swiftc编译器的解释型、交互式、可脚本化的“REPL”版本。
然后,扩展范围,将swift视为扩展生态系统的基础,该生态系统不需要Xcode(除非需要AppleOS SDK来针对Apple硬件)。

swift --help

# SUBCOMMANDS (swift <subcommand> [arguments]):
#   build:   SwiftPM - Build sources into binary products
#   package: SwiftPM - Perform operations on Swift packages
#   run:     SwiftPM - Build and run an executable product
#   test:    SwiftPM - Build and run tests
  • 命令行示例 *
> swift
Welcome to Swift version 5.5.2-dev.
Type :help for assistance.
  1> 8 + 9 
$R0: Int = 17
  2> :quit

注:Swift REPL与LLDB调试器结合使用,因此在REPL会话期间,:位于helpquit等命令之前。

  • Swift脚本示例 *

脚本example_script.swift文件:

#!/usr/bin/swift

// File: example_script.swift
// reminder: chmod to executable before invoking the script

import Foundation

func printHelp() {
    print("Please add an argument to the command line. Thanks.")
}

// --- main ---
if CommandLine.argc < 2 {
    printHelp()
} else {
    for i: Int in 1 ..< Int(CommandLine.argc) {
        print( CommandLine.arguments[i] )
    }
}

解释和编译脚本执行:

ls -l example_script.swift 
# -rwxr--r--@ 1 user staff  321 Dec 30 16:56 example_script.swift

./example_script.swift 
# Please add an argument to the command line. Thanks.

./example_script.swift a bcd
# a
# bcd

## Let's compile the script...
swiftc example_script.swift 

ls -l ex*
# -rwxr-xr-x  1 user staff  55136 Dec 30 16:57 example_script
# -rwxr--r--  1 user staff    321 Dec 30 16:56 example_script.swift

./example_script
# Please add an argument to the command line. Thanks.

./example_script xyx
# xyz

REPL:读取评估打印循环

相关问题