Xcode命令列 = Xcode Command Lines Tool
如果你是一个iOS/Mac Developer 或是你在用Mac开发什么坏坏的事
你一定对这个画面不陌生,

然后我们只需要按下安装,

之后就能继续开发啦!

本文结束.
.
.
.
Ok, 所以.... 这个Dialog到底帮我们安装了什么? 安装在哪? 为何要安装?
安装了什么
如弹窗所说 命令列开发者工具 (command line developer tools),可以从Apple Developer单独下载

有macOS SDK, LLVM编译器, linker...等开发环境,
我们之后再来仔细地看看里面的内容。
这里有一篇官方对常见关于Xcode Command Line发问做的FAQ Building from the Command Line with Xcode FAQ
安装在哪
为了得知安装的路径,我们使用 SuspiciousPackage 查看下载dmg里的.pkg

哦! 所以 Command Line Tools 在mac的 唯一路径 就是
/Library/Developer/CommandLineTools !!!

仔细看看上上张图的描述 - 如果你是用Xcode, Xcode 是自带 Command Line Tools的 (老的Xcode是不默认安装的)

那放在 Xcode 的哪呢??
Xcode.app/Contents/Developer
目录结构基本类似于安装在 Library的目录结构,但是多了不少东西,
我们会在之后提到他们

多份 Command Line Tools
那.. 如果说我有多份的 Xcode 哪就有多份的 Command Line Tools ?? 😱

基于目前的讨论,你的 mac 开发环境可以是以下这样的

于是就有了三连问,现在使用的是哪一个?我该用哪一个?怎么切换成另一个?
Xcode-Select
To answer your question. I bring you
xcode-select
作为一个command指令,名称还是挺浅显易懂的,也许你并不陌生。来让我们敲个 man xcode-select 瞅瞅👀

描述内容简述如下
xcode-select 管理着 xcode的Developer Directory 你能轻松得使用 xcode-select --switch 在多个版本的Xcode之间切换对应的开发工具路径, 而这些路径将被用于 xcrun, xcodebuild, cc ...
xcrun, xcodebuild,这又钓出了许多熟悉不过的指令,我们一样后面说。
xcode-select用法:
-s <path>, --switch <path>:- 将路径指向某个Command Line Tools, ex:
xcode-select --switch /Applications/Xcode.app
- 将路径指向某个Command Line Tools, ex:
-p, --print-path:- 打印目前指向的路径, ex:
/Applications/Xcode.app/Contents/Developer
- 打印目前指向的路径, ex:
-r, --reset:- 将之前用-s 指定的路径重置, (笔者是指回application里的xcode)
--install:- 弹出安装Command Line Tools视窗,对 还是它

上面描述提到xcodebuild..等指令用的环境是基于xcode-select指向的路径,xcode-select提供了一个环境变量,让你能临时使用其他环境来执行xcode command.
env DEVELOPER_DIR="/Applications/Xcode-beta.app" /usr/bin/xcodebuild
xcode-select的好处
有了这个机制,我们就能同时拥有多个开发环境,不同的Swift版本, 不同的模拟器版本...而我们编译的指令不需要用 /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
只需要统一用 xcrun xcodebuild。
xcode-select in Xcode
你可以在 Xcode -> Preference -> Locations 去选择自己得 Command Line Tools,
在这里选择 效力等同于 xcode-select, 所以也是需要user密码。

为何要安装 Command Line Tools
现在你知道 command Line Tools '大概是哪些东西', '放在哪些地方'
当然你可能也已经知道许多tool的用途,例如很熟悉的xcodebuild, 但既然我都从头讲了,就讲全一点 😅😅
For Xcode

就像大部分的软件一样,我们看到的,操作的都是软件的GUI,而Xcode的底层对应的就是Command Line Tool,
例如按下 Build键 => xcodebuid ..., 开一台模拟器 => simctl ...,当然这些都不是一对一的映射,而是多个command 的组合。
我们之后会介绍几个常见的组合。
For others
然而就算你不是使用Xcode开发,还是会碰到需要安装Command Line Tools的情况(也就是使用安装在/Library/Developer/CommandLineTools的那组),因为Tools也有包含整个MacOS的SDK还有编译器Clang甚至包括Make。
例如有使用Homebrew在管理package的一些python开发或是js的开发,都会提示需要Xcode Command Line Tools.
Futher More
现在我们知道 Command Line Tools 是什么,安装在哪,以及Command Line Tools 有多个。
之后的一系列文章我会来介绍 Command Line Tools里,确切包含了哪些命令列工具